欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

[Net] 让 .

最编程 2024-04-23 09:15:18
...

开篇问题

" 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更灵活使用一些。

添加引用

非常简洁的调用如下

            //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。

设置Platform

这个示例还稍加封装,以(二)为基础,支持把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());