如何在同一进程中加载​​的两个.NET CLR相互通信?

时间:2012-06-20 00:16:05

标签: c# clr dll-injection clr4.0 clr-hosting

现在可以在同一个盒子上运行两个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,这将非常有用

2 个答案:

答案 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