【问题标题】:problem with get data from MSScriptControl从 MSScriptControl 获取数据的问题
【发布时间】:2009-09-01 10:37:21
【问题描述】:

我在 C# 控制台应用程序中从 vbscript 获取数据时遇到问题。 我只是写下面的代码:

        int[] i = new int[3] { 1, 2, 3 };
        string msg = "";
        object[] myParam = { msg , i};
        MSScriptControl.ScriptControlClass sc = new MSScriptControl.ScriptControlClass();            
        sc.Language = "VBScript";
        sc.AddCode("Sub Test(ByRef msg, ByRef aryI)" + Environment.NewLine + 
                    "  msg = \"234\"" + Environment.NewLine +                        
                    "End Sub");
        sc.Run("Test", ref myParam);

我想在调用 Run 方法后获取 msg 修改后的字符串,但它不再起作用(没有任何变化)

你能帮帮我吗?

提前致谢

【问题讨论】:

    标签: c# vbscript scriptcontrol


    【解决方案1】:

    您将不得不使用 Eval 函数或类似的东西将值返回给您。

    int[] i = new int[3] { 1, 2, 3 };        
    string msg = "";        
    object[] myParam = { msg , i};        
    MSScriptControl.ScriptControlClass sc 
       = new MSScriptControl.ScriptControlClass();
    sc.Language = "VBScript";
    sc.AddCode("Function Test(ByRef msg, ByRef aryI) as String" + 
    Environment.NewLine +  "  msg = \"234\"" + 
    Environment.NewLine +  "  Test = msg" + // this Test=msg is a return statement
    Environment.NewLine + "End Function");
    
    msg = (string)sc.Run("Test", ref myParam);
    or 
    msg = (string)sc.Eval("Test",ref myParam);
    

    我不知道上面哪一个会正常工作,但会有类似的东西。

    您正在将变量传递给脚本,仅在脚本实例中,该变量用作引用,但是当 C# 在 sc.Run 方法中传递变量时,它将它作为唯一值传递,而不是引用。

    您无法检索脚本中的 ByRef 值。

    另一种方法是传递整个对象。

    [ComVisible(true)]
    public class VBScriptObjects{
          public string Property1 {get;set;}
          public string Property2 {get;set;}
    }
    
    
    VBScriptObjects obj = new VBScriptObjects();
    
    sc.AddObject( "myObj", obj , false);
    sc.Run("myObj.Property1 = 'Testing'");
    
    obj.Property1 <-- this should have a new value now..
    

    制作类 ComVisible,可以让你通过 vbscript 访问和更改属性。

    【讨论】:

    • 非常感谢您的快速回复。但我需要更改多个参数并返回所有参数。使用 Function 我们只能得到一个。
    • 请检查我刚刚添加的替代版本。
    • 亲爱的 Akash Kava,我这样做了,但是在运行应用程序时,得到“指定的演员表无效。” sc.AddObject("myObj", obj , false);注意:我只是为类和项目设置了 comvisible(true),但得到了同样的错误。你能帮帮我吗?
    猜你喜欢
    • 2012-03-31
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-17
    • 2023-03-03
    相关资源
    最近更新 更多