沉锅 發表於 2022-1-4 10:25:00

C# 执行Javascript脚本

<p>前一阵子使用C#编写SCXML状态机,需要解析EMCScript表达式,使用了Jint库(https://github.com/sebastienros/jint/),当时感觉与C#之间的数据转换不是很方便。这两天有时间又关注了一下,发现新的3.0版本有了很大改进,在这里介绍给大家,供参考。</p>
<p>首先要安装nuget包,注意增加prerelease选项,安装最新的版本,使用dotnet命令行指令如下:</p>
<pre><code>dotnet addpackage Jint --prerelease
</code></pre>
<p>直接计算表达式:</p>
<pre><code>Console.WriteLine("直接计算表达式:(1+2)*3");
var r1= e.Evaluate("(1+2)*3");
Console.WriteLine(r1);

</code></pre>
<p>字符串操作:</p>
<pre><code>Console.WriteLine("字符串操作:'abc'.length");
var r2=e.Evaluate("'abc'.length");
Console.WriteLine(r2);

Console.WriteLine("-----------------------");
Console.WriteLine("字符串操作:'abc'.substr(2)");
var r3=e.Evaluate("'abc'.substr(2)");
Console.WriteLine(r3);
</code></pre>
<p>可以使用SetValue给JS变量赋值:</p>
<pre><code>var e2 = new Engine()
    .SetValue("x", 1)
    .SetValue("y",2);
var r4=e2.Evaluate("x+y");
Console.WriteLine(r4);

</code></pre>
<p>可以使用对象进行C#和JS之间的数据交换:</p>
<pre><code>var myobj= new Student {
    Name="张三"
};
Console.WriteLine(myobj.Name);
var e4 = new Engine()
    .SetValue("student", myobj)
    .Execute("student.Name = '李四'");
Console.WriteLine(myobj.Name);
</code></pre>
<p>可以将C#函数委托给JS引擎,在JS代码中调用这些函数:</p>
<pre><code>Console.Write("将CSharp函数设置给Js引擎");
var engine = new Engine()
    .SetValue("log", new Action&lt;object&gt;(Console.WriteLine));
engine.Execute(@"
    function hello() {
      log('Hello World');
    };

    hello();
");

</code></pre>
<p>也可以从CSharp 调用JS的函数:</p>
<pre><code>Console.WriteLine("调用JS函数计算BMI");
var e5=new Engine()
    .Execute("function bmi(weight, height) { return weight/height/height; }");
Console.WriteLine(e5.Invoke("bmi",75,1.75));

</code></pre>
<p>可以引入CLI,从而在JS引擎中调用CLI中的函数:</p>
<pre><code>Console.WriteLine("调用.Net函数写入文件");
var e6 = new Engine(cfg =&gt; cfg.AllowClr());
e6.Execute(@"var f=System.IO.StreamWriter('sayhello.log');
      f.WriteLine('你好 !');
      f.Dispose();");
</code></pre>
<p>示例可以从github下载:https://github.com/zhenl/CSharpScriptDemo,本文示例在JSInCSharp项目中。</p>


</div>
<div id="MySignature" role="contentinfo">
    <p>本文来自博客园,作者:寻找无名的特质,转载请注明原文链接:https://www.cnblogs.com/zhenl/p/15756305.html</p><br><br>
来源:https://www.cnblogs.com/zhenl/p/15756305.html
頁: [1]
查看完整版本: C# 执行Javascript脚本