C# Microsoft.ClearScript.V8脚本使用

 1、ClearScript支持的功能和适用场景

微软的.net是非常强大和灵活的,除了C#体系脚本扩展,也支持其他流行的脚本扩展,Microsoft.ClearScript.V8就是一个.NET绑定到Google V8的脚本引擎。它允许.NET应用程序直接从JavaScript代码中调用函数,并返回JavaScript类型。ClearScript.V8可以使用各种JavaScript库(比如jQuery)来提高工作效率,也可以使用它来测试JavaScript代码。

一些常见的用途包括:

1. 调用在JavaScript中编写的函数或库以实现特定的业务逻辑。

2. 将JavaScript UI(如Web页面)嵌入到.NET应用程序中。

3. 为.NET程序提供脚本语言接口。

4. 为.NET程序提供动态加载库的能力。

总之,Microsoft.ClearScript.V8可以使.NET应用程序更具有灵活性和可扩展性,使其能够更好地与JavaScript代码进行交互。

2、如何使用ClearScript

        在C#工程中,通过nuget添加和管理ClearScript包。

         必须添加的是Microsoft.ClearScript.V8,另外每个系统平台需要对应的Native包。Win平台有Microsoft.ClearScript.V8.Native.win-x64和Microsoft.ClearScript.V8.Native.win-x86,根据实际部署环境选择性添加。

C# Microsoft.ClearScript.V8脚本使用_第1张图片

 

3、简单的数据交互示例

         为测试数据交互,我们可以写一个简单的类来验证。

public class PascalData
{
    public int iVal01 { get; set; }
    public int iVal02 { get; set; }
    public float fVal01 { get; set; }
    public float fVal02 { get; set; }
}

     定义V8引擎并使用。

using Microsoft.ClearScript.V8;

//定义数据类
PascalData pascalData = new PascalData();

//创建V8引擎
var engine = new V8ScriptEngine();

//添加pascalData到脚本中,对象名字myPascal
engine.AddHostObject("myPascal", pascalData);

//通过脚本动态定义函数,函数中使用C#定义的myPascal对象
engine.Evaluate("function iVal02(){ var k = myPascal.iVal01 * 3; return k;};");
engine.Evaluate("function fVal02(){  var f = myPascal.fVal01 / Math.PI; return f;};");

pascalData.iVal01 = 1;
pascalData.fVal01 = 10.0f;

//调用脚本中定义的函数
pascalData.iVal02 = (int)engine.Script.iVal02();
pascalData.fVal02 = (float)engine.Script.fVal02();
Console.WriteLine($"{pascalData.iVal01},{pascalData.iVal02},{pascalData.fVal01},{pascalData.fVal02}");

pascalData.iVal01 = 123;
pascalData.fVal01 = 8440.8f;

pascalData.iVal02 = (int)engine.Script.iVal02();
pascalData.fVal02 = (float)engine.Script.fVal02();
Console.WriteLine($"{pascalData.iVal01},{pascalData.iVal02},{pascalData.fVal01},{pascalData.fVal02}");

运行效果如下:

C# Microsoft.ClearScript.V8脚本使用_第2张图片

4、如何获取脚本中定义的对象

         在上面的例子中,我们通过脚本定义了iVal01和iVal02两个函数,然后使用engine.Script.iVal01()和engine.Script.iVal02()想普通方法一样执行。但如果脚本中没有定义相应的函数,执行会报错,怎么判断脚本中是否定义了相应的变量呢?V8引擎提供的方法,可以获取脚本中定义的对象,参考如下:

var memberNames = engine.Script.PropertyNames;
bool hasiVal01 = false;
bool hasiVal02 = false;
foreach (var mb in memberNames)
{
    if (mb.Equals("iVal01"))
         hasiVal01 = true;
    else if (mb.Equals("iVal02"))
         hasiVal02 = true;
}
if (hasiVal01)
    pascalData.iVal02 = (int)engine.Script.iVal02();
if (hasiVal02)
    pascalData.fVal02 = (float)engine.Script.fVal02();

5、使用其他C#和自定义的库

        C#的系统库和自己编写的库,也可以带入脚本中使用

//C#库的DLL名称,不是命名空间名称和类名。DLL可以是系统的和自己定义的
string[] mylib= {
    "mscorlib", "System.Core"
};

engine.AddHostObject("lib", new HostTypeCollection(mylib));
engine.AddHostType("Console", typeof(Console));

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

6、其他

V8引擎github地址:GitHub - microsoft/ClearScript: A library for adding scripting to .NET applications. Supports V8 (Windows, Linux, macOS) and JScript/VBScript (Windows).

C#的脚本参考之前的博文:C# Roslyn编写脚本数据交互示例_PascalMing的博客-CSDN博客

V8引擎使用例子:https://www.cnblogs.com/BH-RJ-WK/p/15984253.html

你可能感兴趣的:(编程,ClearScript,c#,javascript,脚本)