1

这是我的 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

最后,当我将 AddObject() 与字符串对象一起使用时,这是我的例外:

System.Runtime.InteropServices.COMException (0x800A0005):在 Program.cs 中的 Srcipting.Program.CallVbsFunction(Object p) 处的 MSScriptControl.IScriptControl.Run(String ProcedureName, Object[]& 参数) 处的过程调用或参数无效

4

1 回答 1

2

您需要使用一个包装器对象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 String 对象在第一次看时看起来像 MSScriptControl 的本机 vb 字符串,但在第二次看时却不是。


只有在直接注册字符串或注册返回字符串的函数时,才需要使用这个包装器。注册具有字符串类型属性的对象时没有问题。您传递给的参数也没有问题,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 Function
于 2016-05-17T13:21:35.237 回答