我在C#console应用程序中从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修改后的字符串,但它不再起作用(不是任何更改)
你能帮帮我吗?
提前致谢
答案 0 :(得分:2)
您必须使用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);
我不知道上面哪一个会正确地运作,但会有类似的东西。
您正在将一个变量传递给Script,仅在Script的实例中,该变量用作Reference,但是当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访问和更改属性。