微软的.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代码进行交互。
在C#工程中,通过nuget添加和管理ClearScript包。
必须添加的是Microsoft.ClearScript.V8,另外每个系统平台需要对应的Native包。Win平台有Microsoft.ClearScript.V8.Native.win-x64和Microsoft.ClearScript.V8.Native.win-x86,根据实际部署环境选择性添加。
为测试数据交互,我们可以写一个简单的类来验证。
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}");
运行效果如下:
在上面的例子中,我们通过脚本定义了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();
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)");
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