3

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# List,生成的对象是 JS 对象还是 C# 对象?
4

2 回答 2

1

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

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

于 2016-06-02T21:48:20.903 回答
0

让我们逐步了解 Invoke 调用:

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

现在回答你的问题:

  1. 没有代码被注入。您的代码仅从托管转换为脚本(解释)转换为托管执行。
  2. 如果您在 JS 中创建 C# List 对象,则该对象是真正的托管 .Net 对象。
于 2016-06-18T11:49:01.817 回答