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

时间:2016-03-20 14:48:24

标签: 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(script);
 jsEngine.Invoke("write", "Hello World!");  //Displays in Console: "Hello World!"
  • 我无法理解后台会发生什么?哪个编译器会在JS文件中编译注入的c#代码? C#编译器还是JS?
  • 如果我在JS文件中声明了C#List,那么生成的对象是JS对象还是C#对象?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

让我们一步一步地完成Invoke调用:

  1. jsEngine.Invoke使Jint在JavaScript中执行write方法,并传入" Hello World!"
  2. write方法调用System.Console.WriteLine,此时Jint从JavaScript转换回托管代码并调用该方法。
  3. 现在回答你的问题:

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