当前位置:首页 > C#编程 > C#/.net框架 > 正文内容

通过MSScriptControl在C#中嵌入VBScript脚本

秋天2年前 (2022-05-09)C#/.net框架636

 

在集成式视觉处理软件中,我们常需要使用脚本来控制流程或者灵活的计算结果,这常常要求我们在程序中能够嵌入执行脚本代码,而微软的MSScriptControl控件就为这样的需求提供了方便。

MSScriptControl控件是一个COM控件,可以通过VS引用进来。在解决方案的引用目录上单击右键,选择添加引用…-->COM标签-->选择 MicroSoft Script Control 1.0,将控件添加到项目中。使用using MSScriptControl引入命名空间。


一段实例代码如下所示:

string strProgram;

strProgram = "Sub Main\r\nMsgBox \"Hello world!\"\r\nEnd Sub";

ScriptControl sc=new ScriptControl();

sc.Language="VBScript";

sc.Reset();

sc.AddCode(strProgram);

object[] parameters=new object[0];

sc.Run("Main", parameters);

Console.ReadKey();


一些注意点:

1、在网上有看到定义的ScriptControl为ScriptControlClass类型的代码,我在实际使用过程中发现这样的定义会报错,“无法嵌入互操作类型“MSScriptControl.ScriptControlClass”。请改用适用的接口。”。需要将MSScriptControl的“嵌入互操作类型 ”属性更改为false,表示不将COM中的类型嵌入到C#程序集中。

2、ScriptControl有一个Error属性,包含了脚本代码的一些错误,像错误的行号、错误描述等,但是在异常中使用int errLine = sc.Error.Line;会报错,“MSScriptControl.IScriptControl.Error”与“MSScriptControl.DScriptControlSource_Event.Error”之间存在二义性,这是因为ScriptControl同时继承IScriptControl接口和DScritptControlSource_Event接口,而这两个接口中都定义了Error属性。解决这个问题的方法是使用强制类型转换告诉编译器要使用的接口类型,即使用int errLine= ((IScriptControl)sc).Error.Line;。

3、如果执行的VBScript是一个Sub过程,即没有参数的过程,则IScriptControl的Run方法的第二参数需使用object[] parameters=new object[0]来初始化。如果脚本是一个Function过程的话,parameters中应存放function过程的实参。

4、VBScript脚本中,变量不需要声明其类型。例如,Function Add(a,b)是一个可以接受的声明,而Function(a As Integer, b As Integer) As Integer则会报脚本错误。

5、需要通过AddObject方法为脚本传入外部对象时,需要设计ComVisible,把 Properties ->AssemblyInfo.cs -> [assembly: ComVisible(false)] 改为 [assembly: ComVisible(true)]。

6、MSScriptControl的AddObject方法可以向MSScritptControl中添加C#的对象,需要注意的是这个C#对象的类型声明(即这个对象的class)必须是public的,否则运行中会抛出“指定的转换无效”的异常。




下面的VBScript代码传入this指针,因此可以初始化窗体的Text的属性为当前时间。


image.png


image.png

#转载请注明出处 www.skcircle.com 《少有人走的路》勇哥的工业自动化技术网站。

扫描二维码推送至手机访问。

版权声明:本文由7点博客发布,如需转载请注明出处。

本文链接:http://6dot.cn/?id=137

标签: .NET.NET框架
分享给朋友:

“通过MSScriptControl在C#中嵌入VBScript脚本” 的相关文章

C# 控件闪烁问题的解决

C# 控件闪烁问题的解决

说一下解决C#下控件闪烁的几个问题,如下:  listview和datagridview显示数据闪烁 自定义控件的显示闪烁listbox滚动条拖动闪烁面板中控件过多的闪烁propertyGrid点击和修改项目缓慢的问题richtextbox控件的刷新显示问题此类问题对于界面复杂规...

C# 当List.Find()返回一个结构体对象时,如何判断它为空?

C# 当List.Find()返回一个结构体对象时,如何判断它为空?

请看演示程序。我们知道List.Find() 如果找到则返回这个对象,找不到返回这个类型的缺省值。下面例子中,你无法这样写:            if(res1==null)        &nbs...

C#的变迁史 - C# 4.0 之线程安全集合篇

C#的变迁史 - C# 4.0 之线程安全集合篇

作为多线程和并行计算不得不考虑的问题就是临界资源的访问问题,解决临界资源的访问通常是加锁或者是使用信号量,这个大家应该很熟悉了。  而集合作为一种重要的临界资源,通用性更广,为了让大家更安全的使用它们,微软为我们带来了强大的并行集合:System.Collections.Concurrent里面的各...

C#测量程序运行时间及cpu使用时间

C#测量程序运行时间及cpu使用时间

对一个服务器程序想统计每秒可以处理多少数据包,要如何做?答案是用处理数据包的总数,除以累记处理数据包用的时间。这里要指出的是, 运行一段程序,使用的cpu时间,跟实际运行的时间是不一样的。附例如下:C#private void ShowRunTime() {...

计算代码执行时间,可以精确到十亿分之一秒

计算代码执行时间,可以精确到十亿分之一秒

注:.Net的Stopwatch类可以精确到1/10000毫秒, 有没有更精确的计时吗?见下面的代码。暂时没试过效果,大家可以试下。计算某个代码片段的执行时间,精确到CPU执行一条指令所用的时间(十亿分之一秒),可用于精确计算某个算法的执行时间。 代码:C#using Syste...

C# 查询运算符测试

C# 查询运算符测试

测试一下全部的查询运算符。每天测试一部分,代码会持续更新中……C#using System;using System.Collections;using System.Collections.Generic;using System.Linq;using&nb...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。