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

.net 是否可以动态更改激活旧程序集(BindAsLegacyV2Runtime)的CLR运行时?,.net,runtime,clr,.net,Runtime,Clr,我的问题是: 我必须做一个由第三方应用程序托管的插件。该应用程序是一个MFC应用程序,为了实现我的插件,我必须实现一个COM对象。我的COM对象在C#中,需要与.NET4程序集进行互操作(因此,我的C#项目以.NET4为目标) 当我测试时,它不起作用。。。我收到了例外情况: 混合模式程序集是根据运行时版本“v2.0”生成的,如果没有其他配置信息,无法在4.0运行时中加载 现在,由于我正在进行与第三方应用程序的集成,添加带有useLegacyV2RuntimeActivationPolicy集的a

我的问题是:

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

当我测试时,它不起作用。。。我收到了例外情况: 混合模式程序集是根据运行时版本“v2.0”生成的,如果没有其他配置信息,无法在4.0运行时中加载

现在,由于我正在进行与第三方应用程序的集成,添加带有useLegacyV2RuntimeActivationPolicy集的app.exe.config文件似乎不是一个可接受的解决方案(或者是吗?)

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

长话短说,我被困住了。是否有一种方法可以动态更改负责旧版加载策略的运行时


感谢您的帮助。

因为您是不同应用程序的加载组件,所以您将始终面临加载顺序问题,从而导致加载不同的运行时。你能做的就是尝试使用.NET4S指南来确保你加载了你想要的东西

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


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

因为您是不同应用程序的加载组件,所以您将始终面临加载顺序问题,导致加载不同的运行时。你能做的就是尝试使用.NET4S指南来确保你加载了你想要的东西

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

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