本文章介绍下自己这刚实现的一个c#与js交互的插件。需求来源于一次与朋友的讨论。主要对话如下:

朋友:最近我想模拟一些数据,来测试我现在写的接口,但手工编写这些测试数据太麻烦了

本人:是啊,.net能生成模拟数据的开源库的不少吧。不过就我们搞前端的有个叫Mock.js这方面挺好用的

朋友:说来听听

本人:我就一来二去的把Mock.js的简单应用和能力说了一通。朋友立即就被我的言语所吸引

朋友:要不,你来一个

本人:这,试试吧

说干就干,我就开始着手在网上寻找.net能与Js交互的插件,做为前端的我知道V8引擎在解析Js性能一流,就想用吧。然后就一通的搜索和寻找,终于被我找到。他就是ClearScript。首先来一个设计图:

一、接口和实现

1.1 IExecute接口

此接口主要实现三个方法执行方法:

ExecuteNoResult:没有返回值的执行接口

Execute:执行Js代码,并接收返回值。其中第二个参数resultKeys做为需要返回值列表变量名称集合。

1.2 IPlugin接口

此接口就要规范了一个插件需要的方法,让一个实体类成为一插件,对插件的定义:要么他是有生命周期的(需要手动结束他的生命周期);要么他对资源消耗比较大(需要才动释放资源)。

Install:安装一个插件的方法

UnInstall:卸载一个插件的方法

1.3 接口的相关实现

V8Execute实现的V8引擎执行Js代码的能力,而V8ExecuteThridPart,他继承于V8Execute,并实现了插件接口的能力,可以用于管理。ResultInfo类作为执行接口的返回基类,主要实现Js代码的输出可被.net程序可使用。这样就实现了Js的模拟数据回传给.net。实现代码如下:

public class V8ExecuteForThirdPart : V8Execute, IPlugin
{
private IList<string> thirdFilePaths; /// <summary>
/// 构造
/// </summary>
/// <param name="thridPart"></param>
public V8ExecuteForThirdPart(string[] thirdPart)
:this(AppDomain.CurrentDomain.SetupInformation.ApplicationBase, thirdPart)
{ } public V8ExecuteForThirdPart(string prefix, string[] thirdPart)
{
this.thirdFilePaths = new List<string>();
foreach(var part in thirdPart)
{
this.thirdFilePaths.Add(System.IO.Path.Combine(prefix, part));
}
} public bool Uninstall()
{
this.Dispose();
return true;
} public bool Install()
{
foreach(var file in this.thirdFilePaths)
{
string code = this.ReadFile(file);
if (string.IsNullOrWhiteSpace(code)) continue;
this.ExecuteNonResult(code);
}
return true;
} private string ReadFile(string fileFullPath)
{
string txt = System.IO.File.ReadAllText(fileFullPath, Encoding.UTF8);
return txt;
}
}

三、测试

实现代码如下:

static void Main(string[] args)
{ string[] jsFiles = { "jsLib\\mock.js" };
SAM.Framework.Plugins.IPlugin plugin = new SAM.JavaScript.V8.V8ExecuteForThirdPart(jsFiles);
SAM.Framework.Javascript.IExecute execute = plugin as SAM.Framework.Javascript.IExecute;
plugin.Install();
SAM.Framework.Javascript.ResultInfo resultInfo = execute.Execute("\r\n var result=Mock.mock('@email')");
resultInfo = execute.Execute("\r\n var result=result");
Console.WriteLine(resultInfo.Content["result"]);
Console.ReadKey();
}

首先加载jsLib下的mock.js文件,此加载在plugin.Install方法被调用实值,然后通过Execute方法进行相关代码的执行。多个次调用Execute方法,其V8引擎实例引用的是多一个。这也就节省的资源的开销,以及执行代码上下文的串联。

测试代码下载,此代码如果没办法编译,如果有需要可以联系本人,主要是这些dll是抽简出来的,不保证一定可以运行,后期一定完成一个真实可用的示例。

简单实现 C# 与 Javascript的兼容的更多相关文章

  1. Echo.js – 简单易用的 JavaScript 图片延迟加载插件

    Echo.js 是一个独立的延迟加载图片的 JavaScript 插件.Echo.js 不依赖第三方库,压缩后不到1KB大小. 延迟加载是提高网页首屏显示速度的一种很有效的方法,当图片元素进入窗口可视 ...

  2. 一套简单可依赖的Javascript库

    还是[百度]的产品——Tangram不是我偏心,百度不是我亲戚这东西看上去确实不错 Tangram是一套简单可依赖的Javascript库,主要分为Base和Component两部分.Base提供了开 ...

  3. (译文)12个简单(但强大)的JavaScript技巧(二)

    原文链接: 12 Simple (Yet Powerful) JavaScript Tips 其他链接: (译文)12个简单(但强大)的JavaScript技巧(一) 强大的立即调用函数表达式 (什么 ...

  4. (译文)12个简单(但强大)的JavaScript技巧(一)

    原文连接: 12 Simple (Yet Powerful) JavaScript Tips 我将会介绍和解析12个简单但是强大的JavaScript技巧. 这些技巧所有的JavaScript程序员都 ...

  5. JavaScript的兼容小坑和调试小技巧

    JavaScript作为一种弱类型编程语言,入门简单,只要稍微注意一下IE方面的兼容性,就可以很好的使用它. 本文主要是对IE兼容的小坑和调试的小技巧进行举例分析,并给出解决方法. 1.var str ...

  6. 简单谈一谈JavaScript中的变量提升的问题

    1,随笔由来 第一天开通博客,用于监督自己学习以及分享一点点浅见,不出意外的话,应该是一周一更或者一周两更.  此博客所写内容主要为前端工作中遇上的一些问题以及常见问题,在此基础上略微发表自己的一点浅 ...

  7. 简单的鼠标可拖动div 兼容IE/FF

    来源:http://www.cnblogs.com/imwtr/p/4355416.html 作者: 主要思路: 一个div,注册监听onmousedown事件,然后处理获取的对象及其相关值(对象高度 ...

  8. JavaScript XML 兼容处理,序列化和反序列化以及回调事件

    浏览器中XML DOM的支持 IE中通过ActiveXObject实现了XML的支持,存在一下几个版本:Microsoft.XmlDom,MSXML2.DOMDocument,MSXML2.DOMDo ...

  9. 最简单的例子理解Javascript闭包

    理解Javascript的闭包非常关键,本篇试图用最简单的例子理解此概念. function greet(sth){ return function(name){ console.log(sth + ...

随机推荐

  1. 分布式缓存技术之Redis_03分布式redis

    目录 1. Redis集群 集群作用 主从复制 集群安装配置 集群数据同步及原理 2. Redis哨兵机制 master选举 哨兵sentinel的作用 哨兵sentinel之间的相互感知 maste ...

  2. JS与CSS那些特别小的知识点区别

    1:target与currentTarget的区别 currentTarget指向的事件绑定的元素,target指向的是你点击的元素 2:attr与jprop在jQuery在API当中的区别 2.1: ...

  3. 51单片机创建PDF文件

    PDF文件有特定的格式要求,本以为.TXT与.PDF之间可以相互转换,只需要修改后缀名就可以了,然而事实并非如此. 如下为.PDF文件打开的编码显示. 如果需要创建PDF文件,只需要按照PDF的编码格 ...

  4. BZOJ.5319.[JSOI2018]军训列队(主席树)

    LOJ BZOJ 洛谷 看错了,果然不是\(ZJOI\)..\(jry\)给\(JSOI\)出这么水的题做T3么= = 感觉说的有点乱,不要看我写的惹=-= 对于询问\(l,r,k\),设\(t=r- ...

  5. 神奇高效的Linux命令行

    一.为什么要学linux命令 Linux是由命令行组成的操作系统,精髓在命令行,无论图形界面发展到什么水平,命令行方式的操作永远是不会变的.Linux命令有许多强大的功能:从简单的磁盘操作.文件存取, ...

  6. 201771010126 王燕《面向对象程序设计(Java)》第十周学习总结

    实验十  泛型程序设计技术 实验时间 2018-11-1 1.实验目的与要求 (1) 理解泛型概念: 泛型:也称参数化类型(parameterized type),就是在定义类.接口和方法时,通过类型 ...

  7. zuoye

    a=input('请输入一个数字:') b=input('请再输入一个数字') sum2=int(a)+int(b) print('两个数字的和是:{}'.format(sum2)) a=input( ...

  8. vue项目中的相关插件

    所有安装都是cd到该项目目录中安装 -S代表将插件添加到项目中的package.json文件 1.iview 是一套基于 Vue.js 的开源 UI 组件库,主要服务于 PC 界面的中后台产品 cnp ...

  9. JPG、PNG、GIF、SVG 等格式图片区别

    1.图片 2. 前言 首先,我们要清楚的是,图片从类型上分,可以分为 位图 和 矢量图. 位图:位图又叫点阵图或像素图,计算机屏幕上的图是由屏幕上的发光点(即像素)构成的,每个点用二进制数据来描述其颜 ...

  10. Spring Security 整合freemaker 实现简单登录和角色控制

    Spring Security 整合freemaker 实现简单登录和角色控制     写这篇文章是因为我做了一个电商网站项目,近期刚加上权限控制.整个过程很简单,在此给大家梳理一下,也算是自己对知识 ...