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

标签 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 环境注入(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/

相关文章:

C#检查字符是否为标记的方法

c# - 必须在非通用静态类中定义扩展方法 - 从文档中提取 XML

c# - 安全存储 Azure Key Vault clientSecret

c# - StringBuilder 如何决定它的容量应该有多大?

c++ - DLL 注入(inject) : DrawText and TextOut doesn't return all text

c++ - Firefox pr_write 钩子(Hook)。 dll 注入(inject),Windows 钩子(Hook)

c# - devexpress 饼图显示值的百分比

c# - 分析期间出现未知函数 CoUninitializeE

.net - 什么可以解释托管堆上超过 5,000,000 个 System.WeakReference 实例?

c++ - 用DLL注入(inject)C++读写