zoukankan      html  css  js  c++  java
  • 简单实现 C# 与 Javascript的兼容

    本文章介绍下自己这刚实现的一个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("
     var result=Mock.mock('@email')");
                resultInfo = execute.Execute("
     var result=result");
                Console.WriteLine(resultInfo.Content["result"]);
                Console.ReadKey();
            }

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

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

  • 相关阅读:
    angular 复选框回选
    $parse
    AngularJS 指令的 Scope (作用域)
    文献解读 (1)
    献给初学者:常用的细胞凋亡检测方法
    KofamKOALA
    Dfam.h5.gz下载
    Augustus-3.3.3安装
    bamtools 2.5.1安装
    R语言从原点开始作图
  • 原文地址:https://www.cnblogs.com/cqhaibin/p/7861774.html
Copyright © 2011-2022 走看看