私は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)
)
ありがとうございました。私は自分自身を明確に表現したことを願っています。コメントで何か質問してください。
すっごいを。なぜ私はこれを試していないのですか?ありがとう、作品:) – Sorashi