问题使用'useLegacyV2RuntimeActivationPolicy'& appsRuntime在应用程序中

时间:2010-03-25 23:14:03

标签: .net assemblies versions side-by-side

我修改了几个不同的应用程序'.config文件,如下所示:

<startup useLegacyV2RuntimeActivationPolicy="true">
   <supportedRuntime version="v4.0"/>
</startup>  

当我为devenv.exe.config(VS 2005 - 不要问:))这样做时,事情很有效 - 大多数Visual Studio都使用.NET 2.0,但我能够使用程序集目标。 NET 4.0框架。

我尝试为自定义.exe执行相同的操作,它恰好基于MS CAB(稍加修改)并且具有WPF和WinForms内容的混合组合。一旦我修改了这个应用程序的app配置文件,我就开始在应用程序启动期间获得此异常:

  

撤消操作遇到的上下文与相应的Set操作中应用的上下文不同。可能的原因是在线程上设置了上下文而没有恢复(撤消)。   System.InvalidOperationException:撤消操作遇到的上下文与相应的Set操作中应用的上下文不同。可能的原因是在线程上设置了上下文而没有恢复(撤消)。

有一个很长的堆栈跟踪,它不会直接在我的应用程序代码中显示任何内容(只是一堆MS程序集)。

如果我将应用程序的.config文件修改为:

<startup useLegacyV2RuntimeActivationPolicy="true">
</startup>

ieI删除supportedRuntime元素,然后应用程序不会抛出此异常。但是当我在我的代码中尝试加载我的.NET 4程序集时,如果失败了,那么:

  

System.BadImageFormatException:无法加载文件或程序集''或其依赖项之一。此程序集由比当前加载的运行时更新的运行时构建,无法加载。

我想这是预期的。

我有两个问题:

1)当我修改此应用程序的配置文件以包含supportedRuntime元素,添加.NET 4支持以及有关我可以做些什么的任何建议时,我知道为什么我收到System.InvalidOperationException异常?

2)如果答案是“不知道为什么/不知道你能做些什么”,那么我的.NET 3.5 SP1代码(C#)可以为有条件地添加.NET提供更好的粒度支持对于某个程序集的4运行时支持,而不将我的整个应用程序转换为目标.NET 4,或者不使用声明性配置文件方法?在某些时候,我会将整个应用程序转换为目标.NET 4,但从短期来看,这是一项艰巨的任务,我希望能有一些短期解决方案/黑客攻击。

非常感谢您提供任何建议!

1 个答案:

答案 0 :(得分:4)

我不确定你在VS2005上看到的确切行为,但不应该是“大多数Visual Studio使用.NET 2.0但我能够使用针对.NET的程序集”的情况4.0框架“。该配置应该导致进程中的所有在v4上运行。如果不是这种情况,我当然想知道它,因为它可能是一个错误。 (顺便说一下,我确信你已经意识到你已经超出了支持的方案,将VS2005推向了v4。)

对于无效的操作异常,我的猜测是你在框架之间遇到某种不兼容的问题。我相信我们也想得到一个错误。你可以在例外情况下共享堆栈跟踪吗?

采取增量升级方法......没有一个好的答案。 CLR支持COM组件的进程内SxS激活,因此如果您的应用程序以可以将模块作为COM组件提取的方式实现,那么您可以利用它。问题是,大多数应用程序都不是以这种方式编写的,只需将所有内容升级到v4,就可以减少重新构建应用程序的工作量。

单个程序集加载发生在触发加载的运行时中。对于正常的装配负载,没有进程内SxS激活。