既然可以在同一个盒子上运行两个 CLR,那么它们如何相互“交谈”呢?
假设 GUI 在 .NET 2.0 CLR 下运行,并且有一个脚本在 .NET 4.0 CLR 上运行,例如,有没有办法从 4.0 环境修改基于 2.0 的 GUI?
当我使用此技术将 .NET C# REPL 环境注入(inject)另一个 .net 进程时,我遇到了这个确切的问题:Video: Injecting C# DLLs into Managed (C#) and Unmanaged (C++) processes
注:我问了一个类似的question at Reddit and that version contains large number of references如果您对并行执行和 CLR 托管主题感兴趣,这将很有用
最佳答案
通常,两个单独的 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文章,详细描述了这一点。
至于你的具体例子:
Let's say that the GUI is running under .NET 2.0 CLR and there is a script running on the .NET 4.0 CLR, for example, is there a way to modify the 2.0 based GUI from the 4.0 environment?
如果您尝试直接加载 4.0 程序集,它将失败。您必须使用 COM 互操作来加载它,在这种情况下,所有通信都通过 COM 进行。 4.0 GUI 应用程序可以加载 2.0“脚本”——但它是在 4.0 运行时加载的。
关于c# - 同一进程中加载的两个 .NET CLR 如何相互通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11111235/