C#和JS交互之Microsoft.ClearScript.V8(V8引擎)

.NET兼职社区

之前测试了很多JS引擎,都只支持es5语法,不支持执行es6,测试了下微软的V8反正能跑通,应该是支持的。还得是微软呀。

如图:安装相关包:
在这里插入图片描述
这是参考的官方V8代码

using Microsoft.ClearScript.JavaScript;
using Microsoft.ClearScript.V8;
using Microsoft.ClearScript;
using System.Security.Cryptography;

using (var engine = new V8ScriptEngine())

{

    // 指定JavaScript文件路径
    string filePath = @"D:\test\CallJS\CallJS\test.js";

    // 读取JavaScript文件内容

    string javascriptCode = File.ReadAllText(filePath);




    // expose a host type
    engine.Execute("var window = this;");

    engine.AddHostType("Console", typeof(Console));
    var type = "mp3";
    var mid = 440613;
    var para = $"corp=kuwo&p2p=1&type=convert_url2&sig=0&format={type}&rid={mid}";
    string str = "Console.WriteLine(encryptQuery('112233'))";
    string str1 = "Console.WriteLine(encryptQuery('para'))".Replace("para", para);
    engine.Execute(javascriptCode + C#有偿群:927860652);
    engine.Execute(javascriptCode + str1);
    engine.Execute("Console.WriteLine('{0} is an interesting number.', Math.PI)");



    // expose a host object

    engine.AddHostObject("random", new Random());

    engine.Execute("Console.WriteLine(random.NextDouble())");



    // expose entire assemblies

    engine.AddHostObject("lib", new HostTypeCollection("mscorlib", "System.Core"));

    engine.Execute("Console.WriteLine(lib.System.DateTime.Now)");



    // create a host object from script

    engine.Execute(@"
 
        birthday = new lib.System.DateTime(2007, 5, 22);
 
        Console.WriteLine(birthday.ToLongDateString());
 
    ");



    // use a generic class from script

    engine.Execute(@"
 
        Dictionary = lib.System.Collections.Generic.Dictionary;
 
        dict = new Dictionary(lib.System.String, lib.System.Int32);
 
        dict.Add('foo', 123);
 
    ");



    // call a host method with an output parameter

    engine.AddHostObject("host", new HostFunctions());

    engine.Execute(@"
 
        intVar = host.newVar(lib.System.Int32);
 
        found = dict.TryGetValue('foo', intVar.out);
 
        Console.WriteLine('{0} {1}', found, intVar);
 
    ");



    // create and populate a host array

    engine.Execute(@"
 
        numbers = host.newArr(lib.System.Int32, 20);
 
        for (var i = 0; i < numbers.Length; i++) { numbers[i] = i; }
 
        Console.WriteLine(lib.System.String.Join(', ', numbers));
 
    ");



    // create a script delegate

    engine.Execute(@"
 
        Filter = lib.System.Func(lib.System.Int32, lib.System.Boolean);
 
        oddFilter = new Filter(function(value) {
 
            return (value & 1) ? true : false;
 
        });
 
    ");



    // use LINQ from script

    engine.Execute(@"
 
        oddNumbers = numbers.Where(oddFilter);
 
        Console.WriteLine(lib.System.String.Join(', ', oddNumbers));
 
    ");



    // use a dynamic host object

    engine.Execute(@"
 
        expando = new lib.System.Dynamic.ExpandoObject();
 
        expando.foo = 123;
 
        expando.bar = 'qux';
 
        delete expando.foo;
 
    ");



    // call a script function

    engine.Execute("function print(x) { Console.WriteLine(x); }");

    engine.Script.print(DateTime.Now.DayOfWeek);



    // examine a script object

    engine.Execute("person = { name: 'Fred', age: 5 }");

    Console.WriteLine(engine.Script.person.name);



    // read a JavaScript typed array

    engine.Execute("values = new Int32Array([1, 2, 3, 4, 5])");

    var values = (ITypedArray<int>)engine.Script.values;

    Console.WriteLine(string.Join(", ", values.ToArray()));

}

稍微看下官网案例,就知道怎么用了。

再记录下es6转es5步骤:

1.npm执行以下命令:
npm install -g babel-cli 安装babel

2.查看版本 babel --version

3.初始化项目
执行npm init -y

4.安装转换包 npm install --save-dev babel-preset-es2015

5.转为新es5语法文件 babel src -d dist

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
记得把要转换的文件放在项目根目录,我把js文件放在根目录下的src文件夹中,然后创建.babelrc配置文件在根目录中
内容如下:

{"presets": ["es2015"],"plugins": []
}

在这里插入图片描述

然后会在根目录生成新的dist文件夹,es5版本的JS在里面。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、什么是 ChakraCore ChakraCore 是微软开源的 Microsoft Edge 浏览器 Chakra JavaScript 引擎的核心部分,主要用于 Microsoft Edge 和 Windows 中 HTML/CSS/JavaScript 编写的应用 ChakraCore 支持 x86/x64/ARM 架构 JavaScript 的 Just-in-time (JIT) 编译,垃圾收集和大量的最新 JavaScript 特性。ChakraCore 还支持 JavaScript Runtime (JSRT) APIs ,允许用户简单嵌入 ChakraCore 到应用中。 ChakraCore 是一个功能完整的、独立的 JavaScript 虚拟机,可嵌入到衍生产品中,驱动需要脚本功能的产品如 NoSQL 数据库、生产力工具和游戏引擎。 ChakraCore 现在已经跨平台支持:Windows、MacOS、 Ubuntu 详细参考微软开源地址: https://github.com/Microsoft/ChakraCore 二、ChakraCore架构 三、JS脚本支持有哪些优势? 在流行的脚本语言中,Lua的小巧高性能(性能指LuaJit的性能),Python的功能性一直受开发者青睐。有什么理由使用JS脚本呢? JS脚本有众多的库支持 JS脚本被用于HTML网页开发,开发者众多 JS有众多大公司的支持 JS有优秀的即时编译(JIT)性能 JS有无敌的开发工具Visual Studio的支持 JS语言特性更类似C/C++,相比Lua要舒服很多 Chakra的嵌入优势:相比Lua的堆栈式API,Chakra的API更容易写胶水代码。 很多游戏使用Lua的原因是比Python性能好,没有其他可选方案了。Chakra的开源,应该带动开发者去使用JS脚本。Chakra对于大型Windows游戏开发者更大的好处在于系统支持,Lua需要去下载编译,而Chakra只需要包含头文件,链接lib。 四、QA 可以列出全局对象或函数吗? 可以,除了Intl,这是个特例 JS可以使用引用(c++的,c#的ref)参数吗? 不可以,即使你为传入Native的函数参数修改值也是没用的。 如果一定要用,那只能传一个引用类型的对象,在函数内部修改此对象的成员。var arr=[];(function (v){v[1]=1;})(arr);//arr[1] == 1 Chakra的API支持多线程吗? 支持,据我当前的研究,不同线程必须有各自的runtime对象,每个runtime可以有多个环境(context),同一个runtime下的多个环境可以自由交换数据,但环境之间不共享数据。也就是说api级别可以把环境1的数据带到环境2,但是脚本里,环境2是看不到环境1的数据的。 Chakra支持ES6的Symbol吗? 完全支持。 Chakra如何在原生函数里支持JS的闭包? 函数(function)也是对象(object),可以有自定义属性,所以,在原生API级别操作Chakra时,可以把需要闭包的变量放在函数的属性里。如果希望在脚本中是只读的,那么可以设置属性描述。如果希望在脚本中是隐藏的,那么可以用符号属性。 五、关于世界4大js引擎的简介 google v8 ,目前为止,只能编译出静态链接库版本。静态库将近3G,运行链接一次需要2分钟,太庞大了 mozilla spider monkey,老牌的js引擎,编译后大小合适,很适合使用 ms chakra core,最新的js引擎,支持es6标准,编译后最小,速度很快,我个人蛮喜欢的 苹果的webkit中的javascript core引擎,没编译过,但是感觉不会太小 代码及相关例程截图 目前该组件已经在自身业务上稳定运用近一年,特以此机会开源给大家使用。 选择这个引擎是因为谷歌的V8太大了,而且API对易语言 也不友好,微软这个性能和V8差不太大,API封装友好。也一直在更新。而且体积也只有5M多一点。非常适合做嵌入开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值