我正在使用System.CodeDom.Compiler
. 编译后的源代码中的所有内容都运行良好,无论我在此源代码中放入什么。我知道如何调用我的函数:
o = results.CompiledAssembly.CreateInstance("Foo.Bar");
MethodInfo mi = o.GetType().GetMethod("SayHello");
mi.Invoke(o, null);
但是假设我正在使用 WebClient 使用 WebClient.DownloadStringAsync 异步检索字符串。或者我希望我编译的源代码告诉主机“嘿,我为你准备了一个很好的字符串”的任何其他上下文。例如,我使用了 WebBrowser。基本上,我知道如何处理这两个实例中的每一个:我的托管程序和编译程序,但我希望我的编译程序与主机通信。顺便说一句,我不是一个经验丰富的程序员,所以我没有想到任何明显的方法。
我试过的:
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. 也许我可以通过将类或变量传递给已编译的程序集来共享它?
所以,问题是这个或另一个:
如何有效地观察编译程序中特定变量或属性的变化?
如何将回调附加到主机?