C#中MSScriptControl.ScriptControl组件用法示例

原创 2018年04月17日 16:17:15

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”(位于 * 中)

使用SCRIPTCONTROL注意

BAIDU一下ScriptControl,大多数都是“Delphi中ScriptControl的高级应用(一)”,从CSDN上拷贝过来的,讲得很浅。看得我都无语了。不知有谁能提供更深入的学习资料。下面...
  • vileboy
  • vileboy
  • 2010-02-25 23:34:00
  • 611

C#中MSScriptControl.ScriptControl组件用法示例

MSScriptControl.ScriptControl是C#语言提供的一个COM组件,用来与脚本语言交互执行,支持JScript、VBScript、javascript语言。工作需要设计一个插件交...
  • DXCyber409
  • DXCyber409
  • 2018-04-17 16:17:15
  • 32

C#中使用MSScriptControl中执行 javascript代码

一、使用方法 javascript 中有个eval方法,用过的人都知道他的方便和强大之处。 在C#中,我们也可以通过Com组件来执行一段javascript代码。 下面的代码展示了如何用MSSc...
  • youaregoo
  • youaregoo
  • 2013-12-03 23:31:45
  • 1797

MSScriptControl.ScriptControl控件使用问题

Windows Server 2008 R2,  MSScriptControl.ScriptControl控件使用的时候一直提示如下错误: 检索 COM 类工厂中 CLSID 为 {0E59F...
  • Humourer
  • Humourer
  • 2016-06-14 11:46:22
  • 4024

用MSScriptControl 在 C# winform中执行 javascript js代码并实现传递参数

在C#中,我们也可以通过Com组件来执行一段javascript代码。 下面的代码展示了如何用MSScriptControl 组件执行一段数学表达式:    MSScriptControl...
  • blacksource
  • blacksource
  • 2013-12-11 16:25:02
  • 8930

无法嵌入互操作类型“MSScriptControl.ScriptControlClass”

解决方案资源管理器窗口 -> 右击引用 -> 选择COM中的Mircosoft Script Control -> 确定。这样会将程序集MSScriptControl添加在引用中  解决方案资源...
  • feihu_guest
  • feihu_guest
  • 2013-12-21 12:00:53
  • 6685

无法嵌入互操作类型“MSScriptControl.ScriptControlClass”。请改用适用

解决方案资源管理器窗口 -> 右击引用 -> 选择COM中的Mircosoft Script Control -> 确定。这样会将程序集MSScriptControl添加在引用中     解决方...
  • oMingZi12345678
  • oMingZi12345678
  • 2013-09-09 21:03:33
  • 2414

使用MSScriptControl 在 C# 中读取json数据

C#中已经有JavaScriptSerializer类可以将json数据给反序列化为对象 /// /// JSON文本转对象,泛型方法 /// /// 类型 /// JSON文本 ...
  • rztyfx
  • rztyfx
  • 2015-09-21 23:18:41
  • 1056

在x64 OFFICE中使用ScriptControl控件的方法

在x64 OFFICE中使用ScriptControl控件的方法
  • dengnihuilaiwpl
  • dengnihuilaiwpl
  • 2017-05-23 14:46:46
  • 759

引用MSScriptControl.ScriptControl 在服务器上运行报错 字符转换公式

报错问题:   Retrieving the COM class factory for component with CLSID {0E59F1D5-1FBE-11D0-8FF2-00A0D1003...
  • zhongyuhuan1
  • zhongyuhuan1
  • 2016-05-06 21:13:48
  • 1114
收藏助手
不良信息举报
您举报文章:C#中MSScriptControl.ScriptControl组件用法示例
举报原因:
原因补充:

(最多只允许输入30个字)