现在可以在同一个盒子上运行两个CLR,他们怎么能说话#'彼此?
让我们说GUI在.NET 2.0 CLR下运行,并且在.NET 4.0 CLR上运行了一个脚本,例如,有没有办法从4.0环境修改基于2.0的GUI?
当我使用这种技术将.NET C#REPL环境注入另一个.net进程时,我遇到了这个问题:Video: Injecting C# DLLs into Managed (C#) and Unmanaged (C++) processes
注意:如果您对并行执行和CLR托管主题感兴趣,我会问一个类似的question at Reddit and that version contains large number of references,这将非常有用
答案 0 :(得分:7)
通常,进程中托管两个单独的CLR仅在COM世界中完成。当您使用COM进行扩展等时,会加载适当的运行时。在这种情况下,CLR对象可以通过COM“相互”交谈,因为COM完全是为了互操作性。
纯托管应用程序将始终在4.0 CLR中运行 - 因此加载2.0程序集的4.0应用程序将最终在CLR 4中执行2.0程序集。
有关详细信息,请参阅CLR Inside Out: In-Process Side by Side文章,其中详细介绍了这一点。
至于你的具体例子:
假设GUI在.NET 2.0 CLR下运行,并且在.NET 4.0 CLR上运行了一个脚本,例如,有没有办法从4.0环境修改基于2.0的GUI?
如果您尝试直接加载4.0程序集,它将失败。您必须使用COM interop来加载它,在这种情况下,所有通信都通过COM进行。 4.0 GUI应用程序可以加载2.0“脚本” - 但它在4.0运行时加载。
答案 1 :(得分:1)
主要有两种方式,一种是松耦合或紧耦合。
在松散耦合的系统中,您可以通过某种形式的绑定(JSON,XML,SOAP)来回传递数据。此系统的好处是,您可以在将来使用其他程序,您可能没有想过与应用程序进行交互。
紧密耦合的其他方式可以使用插件,或者使用Windows消息泵来回传送消息。还可以查看Windows Communication Framework