2016-04-27 19 views
0

私はRoslynスクリプトエンジン(名前空間Microsoft.CodeAnalysis.Scripting)を使用するアプリケーションを持っています。私が今持っている何Roslynスクリプト環境でグローバルにアクセスして編集する方法は?

はこれです:

public static async Task<object> Execute(string code, CommandEventArgs e) 
{ 
    if (_scriptState == null) 
    { 
     var options = ScriptOptions.Default; 
     options 
      .AddReferences(typeof (Type).Assembly, 
       typeof (Console).Assembly, 
       typeof (IEnumerable<>).Assembly, 
       typeof (IQueryable).Assembly) 
      .AddImports("System", "System.Numerics", "System.Text", "System.Linq", "System.Collections.Generics", 
       "System.Security.Cryptography"); 
     _scriptState = await CSharpScript.RunAsync(code, options, new MessageGlobal {e = e}); 
    } 
    else 
    { 
     // TODO: set global e (it's not in this variables list, thus it throws null reference) 
     _scriptState.GetVariable("e").Value = e; 
     _scriptState = await _scriptState.ContinueWithAsync(code); 
    } 
    return !string.IsNullOrEmpty(_scriptState.ReturnValue?.ToString()) ? _scriptState.ReturnValue : null; 
} 

それをより明確にするために:私のアプリで 、特定のイベントがあります。ユーザーは、イベントが何らかのC#コードで発生したときに何が起こるかを定義できます(このコードは頻繁に変更されています)。今、ポイントは - 私はスクリプトにイベントの引数を渡す必要があるので、ユーザーはコードでそれを使用することができます。同時に、ユーザーは次回使用したい変数を定義している可能性があるため、エンジン状態を維持する必要があります。

私は既にイベント引数を渡すことができます(そしてeのようにそれをスクリプトで参照します)。ただし初めて(つまり、ScriptStateがnullで、新しいものを作成するときのみ)です。次回このスクリプトまたは他のスクリプトが実行されたとき(ScriptState.ContinueWithAsync)、イベントの引数は以前の状態と同じですが、私はそれらを更新する方法がわからないためです。

eグローバルに到達して新しい値に設定するにはどうすればよいですか?私はすでにVariablesリストからコードにアクセスしてみましたが、グローバルにはリストには載っていないようです。同時に、ScriptVariableクラスに内部コンストラクタがあるため、最初のスクリプトを実行するときに変数を追加することはできません。 (ScriptState.Variables.Add(ScriptVariable)

ありがとうございました。私は自分自身を明確に表現したことを願っています。コメントで何か質問してください。

答えて

4

あなたは、元のe参照更新することができます。

 
public class Globals 
{ 
    public int E; 
} 

static void Main() 
{ 
    var globals = new Globals { E = 1 }; 
    var _scriptState = CSharpScript.RunAsync("System.Console.WriteLine(E)", globals: globals).Result; 
    globals.E = 2; 
    var x = _scriptState.ContinueWithAsync("System.Console.WriteLine(E)").Result; 
} 
+0

すっごいを。なぜ私はこれを試していないのですか?ありがとう、作品:) – Sorashi

関連する問題