проблема с получением данных из MSScriptControl - PullRequest
0 голосов
/ 01 сентября 2009

У меня проблема с получением данных из 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 Ответ

2 голосов
/ 01 сентября 2009

Вам придется использовать функцию 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.

...