开篇问题
" 1 + 3 "的数学运算结果,用.net可以怎么快速实现
一、 JScript.Eval
namespace Microsoft.JScript
{
public sealed class Eval : AST
{
public static object JScriptEvaluate(object source, VsaEngine engine);
public static object JScriptEvaluate(object source, object unsafeOption, VsaEngine engine);
}
}
鉴于VsaEngine 类型已经过期,不应该使用这个方案。64位下无法运行。
二、 JScriptCodeProvider
和(一)均来自Microsoft.JScript
利用JScript.Net可以调用eval,动态编译一个eval的运行时方法。
需要引用Microsoft.JScript.dll
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using System.CodeDom.Compiler;
using Microsoft.JScript;
namespace Gaea.ScriptHelper
{
public class JSEvaluator
{
public static object Eval(string statement)
{
return _evaluatorType.InvokeMember(
"Eval",
BindingFlags.InvokeMethod,
null,
_evaluator,
new object[] { statement }
);
}
static JSEvaluator()
{
JScriptCodeProvider compiler = new JScriptCodeProvider();
CompilerParameters parameters;
parameters = new CompilerParameters();
parameters.GenerateInMemory = true;
CompilerResults results;
results = compiler.CompileAssemblyFromSource(
parameters, _jscriptSource);
Assembly assembly = results.CompiledAssembly;
_evaluatorType = assembly.GetType("JsCodeSpace.JSEvaluator");
_evaluator = Activator.CreateInstance(_evaluatorType);
}
private static object _evaluator = null;
private static Type _evaluatorType = null;
private static readonly string _jscriptSource =
@"package JsCodeSpace
{
class JSEvaluator
{
public function Eval(expr : String) : Object
{
return eval(expr);
}
}
}";
}
}
调用方式
Console.WriteLine(JSEvaluator.Eval("1 + 3").ToString());
三、 MSScriptControl
需要COM引用。同样有不支持64位的问题。
如果已经有完整的js文件,可以用这个方案来呼叫里面的function。比仅仅eval更灵活使用一些。
![](https://img.haomeiwen.com/i13464949/fa2aeef2663a9fa0.png)
非常简洁的调用如下
//using MSScriptControl;
ScriptControl sc = new ScriptControlClass();
sc.Language = "JavaScript";
object result = sc.Eval("1 + 3");
源码
VS2010工程。包含以上二、三的源码。
链接:https://pan.baidu.com/s/1QwcqPb15ETxshmyYcTuL9Q 密码:ag9s
如果运行报错应该设置Platform = x86。在解决方案上右键属性,再选择Configuration Properties。
![](https://img.haomeiwen.com/i13464949/5ee9f10958bab170.png)
这个示例还稍加封装,以(二)为基础,支持把js作为嵌入资源编译到dll并读取后进行调用。比如js源码如下
function helloWorld() {
return "hello world";
}
function caclExpression(expression) {
return eval(expression);
}
function getNow() {
return new Date().toString();
}
function referenceTest() {
return "ref=> " + getNow();
}
C#中可直接呼叫
ScriptRunner scriptRunner = new ScriptRunner("myJsTest.js", Encoding.UTF8, ScriptLanguage.JavaScript);
Object result0 = scriptRunner.Run("helloWorld");
Console.WriteLine(result0.ToString());
Object result1 = scriptRunner.Run("caclExpression", "1 + 3");
Console.WriteLine(result1.ToString());
Object result2 = scriptRunner.Run("getNow");
Console.WriteLine(result2.ToString());
Object result3 = scriptRunner.Run("referenceTest");
Console.WriteLine(result3.ToString());
网友评论