既然可以在同一台机器上运行两个 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托管主题感兴趣,这将非常有用
通常,两个单独的 CLR 的进程内托管仅在 COM 环境中完成。 使用 COM 进行扩展性等时,将加载相应的运行时。 在此方案中,CLR 对象可以通过 COM 相互"通信",因为 COM 完全是关于互操作性的。
纯托管应用程序最终将始终在 4.0 CLR 中运行 - 因此加载 2.0 程序集的 4.0 应用程序最终将在 CLR 4 中执行 2.0 程序集。
有关详细信息,请参阅 CLR 由内而外:进程内并行一文,其中对此进行了详细介绍。
至于你的具体例子:
例如,假设 GUI 在 .NET 2.0 CLR 下运行,并且有一个脚本在 .NET 4.0 CLR 上运行,有没有办法从 4.0 环境中修改基于 2.0 的 GUI?
如果尝试直接加载 4.0 程序集,它将失败。 必须使用 COM 互操作来加载此内容,在这种情况下,所有通信都通过 COM 进行。 4.0 GUI 应用程序可以加载 2.0 "脚本",但它是在 4.0 运行时中加载的。
主要有两种方式,一种是松耦合或紧密耦合。
在松散耦合的系统中,您需要某种形式的绑定(JSON,XML,SOAP)来回传递数据。该系统的好处是,您将来可以使用您可能没有想到的其他程序与应用程序进行交互。
其他方式紧密耦合,您可以使用插件,或者使用 Windows 消息泵来回发送消息。还可以看一眼 Windows 通信框架