C# JINT-无法;console.log";

C# JINT-无法;console.log";,c#,jint,C#,Jint,我对JINT是个新手,我只想做一些基本的测试来学习一些诀窍。我的第一次尝试是在数据库中存储一些javascript,加载它,然后在单元测试中执行它。所以看起来基本上是这样的 [Fact] public void can_use_jint_engine() { using (var database = DocumentStore()) { using (var session = database.OpenSession()) { var sour

我对JINT是个新手,我只想做一些基本的测试来学习一些诀窍。我的第一次尝试是在数据库中存储一些javascript,加载它,然后在单元测试中执行它。所以看起来基本上是这样的

[Fact]
public void can_use_jint_engine() {
    using (var database = DocumentStore()) {
        using (var session = database.OpenSession()) {
            var source = session.Load<Statistic>("statistics/1");

            // join the list of strings into a single script
            var script = String.Join("\n", source.Scripting);

            // this will create the script
            // console.log("this is a test from jint.");
            // 
            var engine = new Jint.Engine();
            // attempt to execute the script
            engine.Execute(script);
        }
    }
}
[事实]
public void可以使用\u jint\u引擎(){
使用(var database=DocumentStore()){
使用(var session=database.OpenSession()){
var source=session.Load(“statistics/1”);
//将字符串列表连接到单个脚本中
var script=String.Join(“\n”,source.Scripting);
//这将创建脚本
//log(“这是来自jint的测试”);
// 
var engine=新的Jint.engine();
//尝试执行脚本
执行(脚本);
}
}
}
它不起作用,我得到了这个错误,这对我来说毫无意义,我也找不到任何关于它的文档

未在中定义Jint.Runtime.JavaScriptExceptionconsole Jint.Engine.Execute(程序)在 Jint.Engine.Execute(字符串源代码)位于 SampleProject.Installers.Instanced.\u测试\u安装程序。可以使用\u jint\u引擎()吗 in_testing_installer.cs:第318行


有人能帮忙解释一下吗?这一点我很困惑。

对于JavaScript,有三个实体——我们关心。主机(浏览器、应用程序等)、引擎(本例中为JINT)和脚本(
console.log(…)

JavaScript将一系列函数和对象定义为语言的一部分,但控制台不是其中之一。按照惯例,浏览器定义一个控制台对象,该对象可以按照您描述的方式使用。但是,由于您的应用程序不是浏览器(JINT本身也不这样做),因此在您的命名空间(globals)中没有定义console对象

您需要做的是添加一个
控制台
对象,该对象可以在JINT中访问。您可以在文档中找到如何做到这一点,但这里有一个简单的示例,说明如何将日志函数添加到引擎中,以便可以从JS代码中使用它(示例取自github)

var引擎=新引擎()
.SetValue(“日志”,新操作(Console.WriteLine))
;
引擎。执行(@“
函数hello(){
日志(“你好世界”);
};
你好;
");

使用JavaScript有三个实体—我们关心。主机(浏览器、应用程序等)、引擎(本例中为JINT)和脚本(
console.log(…)

JavaScript将一系列函数和对象定义为语言的一部分,但控制台不是其中之一。按照惯例,浏览器定义一个控制台对象,该对象可以按照您描述的方式使用。但是,由于您的应用程序不是浏览器(JINT本身也不这样做),因此在您的命名空间(globals)中没有定义console对象

您需要做的是添加一个
控制台
对象,该对象可以在JINT中访问。您可以在文档中找到如何做到这一点,但这里有一个简单的示例,说明如何将日志函数添加到引擎中,以便可以从JS代码中使用它(示例取自github)

var引擎=新引擎()
.SetValue(“日志”,新操作(Console.WriteLine))
;
引擎。执行(@“
函数hello(){
日志(“你好世界”);
};
你好;
");

是否可以使用匿名函数,而不是给它命名
hello
?如果是的话,那将如何实现呢?像<代码>函数(){log('Hello World');}-甚至可以这样做吗?或者每个函数都必须有一个明确的名称吗?您可以只使用示例中的脚本,但不使用控制台。。i、 e:engine.Execute(@“log('Hello World');”);嗯,我的意思是-我想将整个函数存储在数据库中,但它需要包装在函数括号中-但是“名称”在设计时是未知的,所以我想使用匿名函数。所以我还是很困惑。哦,太好了!我得到了它!我必须用额外的
()
来做这件事。看来<代码>(函数(){/*code*/})(),然后我可以在连接的行上调用execute!!!完美的是否可以使用匿名函数,而不是给它起名字
hello
?如果是的话,那将如何实现呢?像<代码>函数(){log('Hello World');}-甚至可以这样做吗?或者每个函数都必须有一个明确的名称吗?您可以只使用示例中的脚本,但不使用控制台。。i、 e:engine.Execute(@“log('Hello World');”);嗯,我的意思是-我想将整个函数存储在数据库中,但它需要包装在函数括号中-但是“名称”在设计时是未知的,所以我想使用匿名函数。所以我还是很困惑。哦,太好了!我得到了它!我必须用额外的
()
来做这件事。看来<代码>(函数(){/*code*/})(),然后我可以在连接的行上调用execute!!!完美的
var engine = new Engine()
        .SetValue("log", new Action<object>(Console.WriteLine))
        ;

    engine.Execute(@"
      function hello() { 
        log('Hello World');
      };

      hello();
    ");