を使用してオンザフライでコードをコンパイルしていSystem.CodeDom.Compiler
ます。コンパイルされたソース内のすべては、私がこのソース内に置いているものは何でもうまく機能します。私は自分の関数を呼び出す方法を知っています:
o = results.CompiledAssembly.CreateInstance("Foo.Bar");
MethodInfo mi = o.GetType().GetMethod("SayHello");
mi.Invoke(o, null);
ただし、WebClientを使用して、WebClient.DownloadStringAsyncを使用して非同期で文字列を取得しているとします。または、コンパイルされたソースがホストに「ねえ、私はあなたのために素敵な文字列を用意しました」と伝えたい他のコンテキスト。この例では、WebBrowserを使用しました。基本的に、ホスティングプログラムとコンパイル済みプログラムの2つのインスタンスのそれぞれを処理する方法を知っていますが、コンパイル済みプログラムがホストと通信するようにしたいです。ちなみに、私は超実験的なプログラマーではないので、わかりやすい方法は思い浮かびません。
私が試したこと:
1。動作するので実際に試す必要はありませんが、コンパイルされたソース内の文字列スタックまたはタスクキューを読み取るタイマーを使用できますが、アプリケーションの目的は、+-60個のスクリプトで実際のタスクを実行できるようにすることです。 、継続的なバックグラウンドプロセスではないため、CPUでは効率的ではありません。
2。ホスティングアプリにあるかのように、コンパイルされたソースにハンドラーを渡しました。
//In the hosting app
MethodInfo mi2 = o.GetType().GetMethod("attachCallbackToHost");
mi2.Invoke(o2, new object[] { new WebBrowserNavigatedEventHandler (wb_navigated) });
//... And the handler
public static void wb_navigated(object sender, WebBrowserNavigatedEventArgs e)
{
string browserHtmlFromCompiledSource = ((WebBrowser)sender).DocumentText;
MessageBox.Show(browserHtmlFromCompiledSource);
}
// Plain text from the compiled source code
public void attachCallbackToHost(WebBrowserNavigatedEventHandler handlerFromTheHost)
{
wb.Navigated += handlerFromTheHost;
}
そしてそれは何もしませんでした。
3。コンパイルされたアセンブリに渡すことで、クラスまたは変数を共有できるかもしれませんか?
だから、問題はこれか他のどちらかです:
コンパイルされたプログラム内の特定の変数またはプロパティ内の変更を効率的に監視するにはどうすればよいですか?
ホストにコールバックを添付する方法は?