首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#运行VBScript,字符串失败的MSScriptControl AddObject

C#运行VBScript,字符串失败的MSScriptControl AddObject
EN

Stack Overflow用户
提问于 2016-05-13 15:04:36
回答 1查看 3.4K关注 0票数 1

这是我的C#程序:

代码语言:javascript
复制
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文件内容:

代码语言:javascript
复制
Function Test(a)
    MsgBox myguid
End Function

最后,当我在string对象中使用AddObject()时,这是我的例外:

System.Runtime.InteropServices.COMException (0x800A0005):在MSScriptControl.IScriptControl.Run(字符串ProcedureName、Object[]和参数)的Srcipting.Program.CallVbsFunction(对象p)处调用或参数无效

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-17 13:21:35

您需要使用包装器对象,即ComVisible

代码语言:javascript
复制
[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字符串。

因此,也许最好的选择不是为脚本提供单独的字符串,而是提供一个对象来封装您希望它使用的所有不同的值。

定义这个类

代码语言:javascript
复制
[ComVisible(true)]
public class HostOptions
{
    public string OptionA { get; set; }
    public string OptionB { get; set; }
}

然后构造对象并设置所有属性并将其注册到脚本控件中。

代码语言:javascript
复制
var hostOptions = new HostOptions();
hostOptions.OptionA = "AAA";
hostOptions.OptionB = "BBB";

sc.AddObject("HostOptions", hostOptions, false);

然后您可以在脚本中使用它,如下所示:

代码语言:javascript
复制
Function Test(a)
    MsgBox HostOptions.OptionA
    MsgBox HostOptions.OptionB
End Function
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37213451

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档