如果我使用 Jint 引擎在 JavaScript 代码中定义一个 .Net 类会发生什么

What happens if I define a .Net class in JavaScript code using Jint engine

本文关键字:一个 Net 什么 定义 Jint 引擎 代码 JavaScript 如果      更新时间:2023-09-26

在 Jint 中,您可以在 JS 中访问 .Net 类。

JS文件代码:

var write = function (msg) {
    var log = System.Console.WriteLine;
    log(msg);
};

C# 代码

 Engine jsEngine = new Engine(e=>e.AllowClr());
 string script = System.IO.File.ReadAllText("file1.js");
 jsEngine.Execute(script);
 jsEngine.Invoke("write", "Hello World!");  //Displays in Console: "Hello World!"
  • 我不明白后台发生了什么?哪个编译器将在JS文件中编译注入的c#代码?C# 编译器还是 JS?
  • 如果我在 JS 文件中声明了 C# 列表,生成的对象是 JS 对象还是 C# 对象?

您没有注入 C# 代码,Jint 解释器将理解您引用的是 .NET 类,因此执行此代码。因为Jint是用.NET编写的,所以它可以运行你要求的任何.NET代码。

此外,Jint 不会编译任何东西,它会读取每个 javascript 语句并尝试一个接一个地评估它们,跟踪您正在声明和使用的所有变量、函数和其他 JS 工件。

让我们逐步完成调用调用:

  1. jsEngine.Invoke 导致 Jint 在 JavaScript 中执行 write 方法,并传入"Hello World!
  2. write方法调用System.Console.WriteLine,此时Jint从JavaScript转换回托管代码并调用该方法。

现在回答您的问题:

  1. 不会注入任何代码。代码仅从托管到脚本(解释)转换为托管执行。
  2. 如果在 JS 中创建 C# List 对象,则该对象是真正的托管 .Net 对象。