美文网首页
[.Net]让.net执行Javascript

[.Net]让.net执行Javascript

作者: 无衔 | 来源:发表于2018-08-10 15:31 被阅读46次

    开篇问题

    " 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());
    

    相关文章

      网友评论

          本文标题:[.Net]让.net执行Javascript

          本文链接:https://www.haomeiwen.com/subject/imykbftx.html