C# 调用JavaScript脚本并进行交互

首先在Github下载ReoScript源码,并进行编译,引用相关的dll
ReoScript

引用文件

 class Program
    {
        static ScriptRunningMachine srm = new ScriptRunningMachine();

        static void Main(string[] args)
        {
            srm.WorkMode |= MachineWorkMode.AllowDirectAccess;

            Case acCase = new Case()
            {
                CaseVariables = new List<Variable>()
                {
                    new Variable("a", 123),
                    new Variable("b", false),
                    new Variable("c", "STR"),
                }
            };
            
            // 注入
            InjectIntProperty(acCase.CaseVariables[0].VariableName, acCase.CaseVariables[0]);
            InjectIntProperty(acCase.CaseVariables[1].VariableName, acCase.CaseVariables[1]);
            InjectIntProperty(acCase.CaseVariables[2].VariableName, acCase.CaseVariables[2]);

            string script = @"a = 222; b = true; c = 'str'";
            srm.Run(script);

            Console.WriteLine(acCase.CaseVariables[0].VariableValue);
            Console.WriteLine(acCase.CaseVariables[1].VariableValue);
            Console.WriteLine(acCase.CaseVariables[2].VariableValue);
        }

        static void InjectIntProperty(string name, Variable obj)
        {
            if (obj.VariableValue.GetType().Name == "Int32")
            {
                srm.SetGlobalVariable(name, new ExternalProperty(
                 () => { return obj.VariableValue; },
                 (v) => { obj.VariableValue = ScriptRunningMachine.GetIntValue(v); }
                 ));
            }
            else if (obj.VariableValue.GetType().Name == "Boolean")
            {
                srm.SetGlobalVariable(name, new ExternalProperty(
                 () => { return obj.VariableValue; },
                 (v) => { obj.VariableValue = ScriptRunningMachine.GetBoolValue(v); }
                 ));
            }
            else if (obj.VariableValue.GetType().Name == "String")
            {
                srm.SetGlobalVariable(name, new ExternalProperty(
                 () => { return obj.VariableValue; },
                 (v) => { obj.VariableValue = ScriptRunningMachine.ConvertToString(v); }
                 ));
            }
        }
    }

    public class Case
    {
        public IList Elements { get; set; }

        public List<Variable> CaseVariables { get; set; }
    }

    public class Variable
    {
        public Variable(string name, object value)
        {
            VariableName = name;
            VariableValue = value;
        }

        public string VariableName { get; set; }

        public object VariableValue { get; set; }
    }

*输出结果为 :
*执行结果

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐