这是我的C#程序:
class Program
{
static void Main(string[] args)
{
CallVbsFunction(1); //Work
CallVbsFunction(1.2); //Work
CallVbsFunction('a'); //Work
CallVbsFunction("a"); //!!Exception see bellow
}
private static void CallVbsFunction(object p)
{
var sc = new MSScriptControl.ScriptControl();
sc.Language = "VBScript";
sc.AllowUI = true;
try
{
sc.AddCode(System.IO.File.ReadAllText("script.vbs"));
sc.AddObject("myguid", p, false);
var parameters = new object[] { "a" };
sc.Run("test", ref parameters);
}
catch (Exception e)
{
Console.Out.WriteLine(e.ToString());
}
}
}我的VBScript文件内容:
Function Test(a)
MsgBox myguid
End Function最后,当我在string对象中使用AddObject()时,这是我的例外:
System.Runtime.InteropServices.COMException (0x800A0005):在MSScriptControl.IScriptControl.Run(字符串ProcedureName、Object[]和参数)的Srcipting.Program.CallVbsFunction(对象p)处调用或参数无效
发布于 2016-05-17 13:21:35
您需要使用包装器对象,即ComVisible。
[ComVisible(true)]
public class StringWrapper
{
private string wrappedString;
public StringWrapper(string value)
{
wrappedString = value;
}
public override string ToString()
{
return wrappedString;
}
}
CallVbsFunction(new StringWrapper("a"));问题是,.net字符串对象在第一次查看时看起来像MSScriptControl的原生vb字符串,而在第二次查找时不像。
您只需要在直接注册字符串或注册返回字符串的函数时使用此包装器。注册具有string类型属性的对象时没有问题。传递给Run()的参数也没有问题,因为这些参数将被.net运行时正确地封送到本机vb字符串。
因此,也许最好的选择不是为脚本提供单独的字符串,而是提供一个对象来封装您希望它使用的所有不同的值。
定义这个类
[ComVisible(true)]
public class HostOptions
{
public string OptionA { get; set; }
public string OptionB { get; set; }
}然后构造对象并设置所有属性并将其注册到脚本控件中。
var hostOptions = new HostOptions();
hostOptions.OptionA = "AAA";
hostOptions.OptionB = "BBB";
sc.AddObject("HostOptions", hostOptions, false);然后您可以在脚本中使用它,如下所示:
Function Test(a)
MsgBox HostOptions.OptionA
MsgBox HostOptions.OptionB
End Functionhttps://stackoverflow.com/questions/37213451
复制相似问题