3

我修改了几个不同的应用程序的 .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 内容。一旦我修改了这个应用程序的应用程序配置文件,我就开始得到这个异常,有时在应用程序启动期间:

Undo 操作遇到的上下文与在相应的 Set 操作中应用的上下文不同。可能的原因是在线程上设置了上下文并且未还原(撤消)。System.InvalidOperationException:撤消操作遇到的上下文与相应的 Set 操作中应用的上下文不同。可能的原因是在线程上设置了上下文并且未还原(撤消)。

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

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

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

即我删除了supportedRuntime 元素,然后应用程序不会抛出这个异常。但是当我在我的代码中尝试加载我的 .NET 4 程序集时,如果失败并出现以下问题:

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

我想这是意料之中的。

我有两个问题:

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

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

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

4

1 回答 1

4

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

至于无效操作异常,我的猜测是您遇到了框架之间的某种不兼容问题。我敢肯定我们也想得到一个错误。您可以在异常处共享堆栈跟踪吗?

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

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

于 2010-03-30T17:44:46.690 回答