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

如果我使用Jint引擎在JavaScript代码中定义一个.Net类,会发生什么,javascript,c#,.net,jint,Javascript,C#,.net,Jint,在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(s

在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#object
    • 如果您没有注入C#代码,Jint解释器将理解您是对.NET类的引用,因此执行此代码。因为Jint是用.NET编写的,所以它可以运行您要求的任何.NET代码


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

      让我们一步一步地了解调用:

    • Invoke使Jint以JavaScript执行write方法,并传入“Hello World!”
    • write方法调用System.Console.WriteLine,此时Jint从JavaScript转换回托管代码并调用该方法
    • 现在回答你的问题:

    • 没有代码被注入。您的代码仅从托管转换为脚本(已解释)转换为托管执行
    • 如果在JS中创建一个C#List对象,该对象就是一个真正的托管.Net对象