3

既然可以让两个 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 托管主题感兴趣,这将很有用

4

2 回答 2

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 互操作来加载它,在这种情况下,所有通信都通过 COM 进行。4.0 GUI 应用程序可以加载 2.0“脚本”——但它是在 4.0 运行时加载的。

于 2012-06-20T00:21:37.633 回答
1

主要有两种方式,一种是松耦合或紧耦合。

在松散耦合的系统中,您将使用某种形式的绑定(JSON、XML、SOAP)来来回传递数据。该系统的好处是您可以在将来使用您可能没有想到的其他程序与应用程序进行交互。

其他紧密耦合的方法可以使用插件,或者使用 Windows 消息泵来来回发送消息。还可以查看Windows 通信框架

于 2012-06-20T00:21:35.183 回答