2016-05-13 69 views
1

這是我的C#程序: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):無效 過程調用o在 MSScriptControl.IScriptControl.Runř參數在 (字符串PROCEDURENAME,對象[] & 參數)在Srcipting.Program.CallVbsFunction(檢體P)的Program.cs

+0

單引號版本傳遞'char' wheres,因爲雙引號傳遞'string' wh ich是_array_的字符 –

+0

是的我的問題是當我使用String時,我知道VBScript使用VARIANT和BSTR,如果我調用MsgBox typename(myguid)返回「String」但不起作用。 – themadmax

+0

如果您使用'sc.AddObject(「myguid」,p [0],false);' –

回答

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對象看起來像一個原VB字符串到MSScriptControl第一的外觀,但不能在第二次看。


您只需要在直接註冊字符串或註冊返回字符串的函數時使用此包裝。註冊具有字符串類型屬性的對象時沒有問題。對於傳遞給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 
+0

我真的不明白「.net String對象在第一次看起來像是MSScriptControl的本地vb字符串但不是第二次看。「但你的解決方案爲我工作。 – themadmax

+0

我不知道細節,但這就是它對我來說的樣子。 – NineBerry