【问题标题】:How can two .NET CLR loaded in the same process talk to each other?在同一个进程中加载​​的两个 .NET CLR 如何相互通信?
【发布时间】:2012-06-22 02:21:46
【问题描述】:

既然可以让两个 CLR 在同一个机器上运行,那么它们如何相互“对话”?

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

当我使用这种技术将 .NET C# REPL 环境注入另一个 .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 访问一个 CLR(请注意,我只控制其中一个)

标签: c# clr dll-injection clr4.0 clr-hosting


【解决方案1】:

通常,两个单独的 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 运行时加载的。

【讨论】:

  • 我看到了那篇文章(我还链接了我在 Reddit 上提出的类似问题:reddit.com/r/dotnet/comments/vawqp/…),但其中没有代码示例。您知道 COM 互操作在实践中是如何发生的吗?请注意,我不是尝试在每个 CLR 中加载程序集,而是尝试从 4.0 CLR 在 2.0 CLR 上运行代码(例如更改表单控件的标题)
  • @DinisCruz 您如何加载 2.0 程序集? (这很重要......)
  • 2.0 CLR 已经在运行,我要做的是向其中注入一个 4.0 dll(这将启动 4.0 CLR)。从我的问题链接的视频显示,在行动中
  • @DinisCruz 您在该视频中注入 LINQPad - 这是 CLR 4。您可以将 .NET 2 程序集注入 CLR 4,它们在 CLR 4 下运行没有问题...
  • 是的,这种情况非常有效(当我注入 .Net 4.0 CLR 进程时)我的问题是注入 .Net 2.0 CLR
【解决方案2】:

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

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

您可以使用插件紧密耦合的其他方式,或使用 Windows 消息泵来来回发送消息。也可以看看Windows Communication Framework

【讨论】:

  • 请注意,我无权访问 2.0 应用程序,即我无法修改其代码(我只能完全控制 4.0 代码)。也就是说,如果我能够在 2.0 clr 下运行代码,我就可以创建那个环境。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-26
  • 2022-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多