Проблема с получением данных из MSScriptControl
У меня проблема с получением данных из vbscript в консольном приложении C#. Я просто пишу ниже код:
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);
Я хочу получить msg измененную строку после вызова метода Run, но она больше не работает (никаких изменений)
Не могли бы вы помочь мне?
заранее спасибо
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);
Я не знаю, какой из вышеперечисленных будет работать правильно, но будет что-то подобное.
Вы передаете переменную в Script, в случае только Script, переменная используется в качестве ссылки, но когда 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.