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

Din*_*ruz 3 c# clr clr-hosting clr4.0 dll-injection

现在可以在同一个盒子上运行两个CLR,它们怎么能互相"说话"呢?

假设GUI在.NET 2.0 CLR下运行,并且在.NET 4.0 CLR上运行了一个脚本,例如,有没有办法从4.0环境修改基于2.0的GUI?

当我使用这种技术将.NET C#REPL环境注入另一个.net进程时,我遇到了这个问题:视频:将C#DLL注入托管(C#)和非托管(C++)进程


注意:我在Reddit上问了一个类似的问题,如果您对并行执行和CLR托管主题感兴趣,那么该版本包含大量引用

Ree*_*sey 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运行时加载.