是否可以动态更改激活旧程序集的CLR运行时(BindAsLegacyV2Runtime)?

时间:2011-08-16 01:10:24

标签: .net runtime clr

这是我的问题:

我必须做一个由第三方应用程序托管的插件。该应用程序是一个MFC应用程序和我的插件,我必须实现一个COM对象。我的COM对象在C#中,需要与.NET 4程序集互操作(因此,我的C#项目以.NET 4为目标)。

当我测试它时,它不起作用......我收到了例外: 混合模式程序集是针对运行时的版本“v2.0”构建的,如果没有其他配置信息,则无法在4.0运行时加载 ...

现在,由于我正在与第三方应用程序进行集成,因此使用 useLegacyV2RuntimeActivationPolicy 设置添加App.exe.config文件似乎不是可接受的解决方案(或者是它? )。

我试图在MFC应用程序和我的.NET代码之间添加额外的C ++层。该层实现COM对象并转发对C#的所有调用。我通过使用ICLRRuntimeInfo :: BindAsLegacyV2Runtime()方法解决了我的混合模式异常。这很好。但是,如果仅在我之前加载使用.NET 2.0的另一个插件,则此方法将失败(因为其他插件启动的.NET 2.0运行时管理旧版加载策略)。

长话短说,我被困住了。有没有办法动态更改负责传统加载策略的运行时?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

因为您是另一个应用程序的加载组件,所以您将始终面临加载顺序的问题,从而导致加载不同的运行时。你可以做的是尝试使用.net 4s In-process side by side指导,以确保你加载你想要的。

虽然为您无法控制的应用程序添加应用程序配置通常是一个坏主意,但有时这是解决问题的唯一方法。我当然可以看到添加app.exe.config和测试 - 但是如果你将插件分发给广大的受众,这可能会有问题。

如果所有其他方法都失败了,您可能必须执行我们所做的操作 - 运行必须在单独进程中使用.net 4程序集的插件部分,并创建与该进程通信的COM插件“shim”。如果您使用.net程序集中的UI,这不是一个好的解决方案,但对于许多其他情况,它可以很好地工作。