MSScriptControl.ScriptControl是C#语言提供的一个COM组件,用来与脚本语言交互执行,支持JScript、VBScript、javascript语言。
工作需要设计一个插件交互库,需要从C#语言转移执行主体到JS代码,并获取JS代码返回值给C#语言。
本篇博文在于演示的用法,详细的MSScriptControl.ScriptControl属性及方法介绍可以参考另一篇博文:
https://www.cnblogs.com/coolsundy/p/7116123.html
能成功运行的步骤:
一.添加引用。本人使用VS2015,在项目->添加引用->COM->类型库中勾选Microsoft Script Control 1.0组件。对在解决方案资源管理器中对项目右键->属性->生成->目标平台x86。x64程序默认没有注册MSScriptControl组件,需要手动操作,此处节省麻烦绕过。
二.C#代码:
注:json3.min.js可在这里下载:https://cdn.bootcss.com/json3/3.3.2/json3.min.js
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices; using MSScriptControl; namespace Test { public class Test3 { public static void Main() { string result = ""; ScriptControl scriptControl = new ScriptControlClass(); //scriptControl.UseSafeSubset = true; scriptControl.Language = "javascript"; string baseDirectory = AppDomain.CurrentDomain.BaseDirectory; scriptControl.AddCode(System.IO.File.ReadAllText(baseDirectory + "hello.js")); // 加载js代码主体 scriptControl.AddCode(System.IO.File.ReadAllText(baseDirectory + "json3.min.js")); // 加载json库 //传入全局变量,可重复传入刷新值 string jsval1 = "{\"test1\":\"123\",\"test2\":\"456\"}"; string jsval2 = "{\"test1\":\"changed1\",\"test2\":\"changed2\"}"; scriptControl.AddCode(string.Format("var jsval = '{0}'", jsval1)); result = scriptControl.Eval(string.Format(@"globalVarTest('{0}')", jsval1)).ToString(); Console.WriteLine("globalVarTest: " + result); scriptControl.AddCode(string.Format("var jsval = '{0}'", jsval2)); result = scriptControl.Eval(string.Format(@"globalVarTest('{0}')", jsval2)).ToString(); Console.WriteLine("globalVarTest: " + result); result = scriptControl.Eval(string.Format(@"sayHello('{0}')", "Helasdsad")).ToString(); Console.WriteLine("sayHello: " + result); result = scriptControl.Eval(string.Format(@"jsonInTest('{0}')", jsval1)).ToString(); Console.WriteLine("jsonInTest: " + result); result = scriptControl.Eval("jsonOutTest()").ToString(); Console.WriteLine("jsonOutTest: " + result); result = scriptControl.Eval("regExpTest()").ToString(); Console.WriteLine("regExpTest: " + result); // 通过js调用C#方法 TestObj outterObj = new TestObj(); outterObj.test("call1", "call2"); //C#调用 scriptControl.AddObject("outterObj", outterObj); scriptControl.Eval("outterCall('call3', 'call4')"); //js调用 // 捕获js内部异常 try{ scriptControl.Eval("exceptionTest1()"); } catch (COMException e) { Console.WriteLine("exceptionTest1: " + e.Message); } try { scriptControl.Eval("exceptionTest2()"); } catch (COMException e) { Console.WriteLine("exceptionTest2: " + e.Message); } } } [ComVisible(true)] public class TestObj { public void test(object obj, string str2) { Console.WriteLine("outterCall: " + obj + str2); } } }
三.所使用的javascript代码,将以下代码粘贴为hello.js,连同上面的json3.min.js一起放到项目的debug文件夹中(默认为Debug模式,其他模式自行变更文件夹)
var tvar = '123asda'; //无用占位变量 function sayHello(str) { return "Hello, " + str; } function globalVarTest() { return jsval; } function exceptionTest1() { throw "sad"; // 抛出异常 } function exceptionTest2() { sfaafs("|"); // 调用方不存在 } function jsonInTest(strjson) { json = JSON.parse(strjson); return json['test1']; } function jsonOutTest() { map = {'x':1, 'y':2}; return JSON.stringify(map); } function outterCall(param1, param2) { outterObj.test(param1, param2); } function regExpTest() { return /e/.test("The best things in life are free!"); // return True }
四.F5执行相关输出结果
globalVarTest: {"test1":"123","test2":"456"} globalVarTest: {"test1":"changed1","test2":"changed2"} sayHello: Hello, Helasdsad jsonInTest: 123 jsonOutTest: {"x":1,"y":2} regExpTest: True outterCall: call1call2 outterCall: call3call4 exceptionTest1: 引发了异常但未捕获 exceptionTest2: 缺少对象 引发的异常:“System.Runtime.InteropServices.COMException”(位于 * 中) 引发的异常:“System.Runtime.InteropServices.COMException”(位于 * 中)