【问题标题】:Problem using ‘useLegacyV2RuntimeActivationPolicy’ & supportedRuntime in an application在应用程序中使用“useLegacyV2RuntimeActivationPolicy”和supportedRuntime 时出现问题
【发布时间】:2010-03-25 23:14:02
【问题描述】:

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

撤消操作遇到的上下文与相应的设置操作中应用的上下文不同。可能的原因是在线程上设置了上下文并且未还原(撤消)。 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,但从短期来看,这是一项艰巨的任务,我希望有一些短期解决方案/hack。

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 马克 - 谢谢你的回复。是的,我想我理解一切都以某种方式在 .NET 4 运行时运行,但我知道 useLegacyV2RuntimeActivationPolicy 以“.NET 2 运行时方式”启动事物(无论这意味着什么)。另外,我意识到不支持将 VS 2005 向前滚动到 V4。我的主要问题不是 VS 2005,而是我自己的自定义 CAB 应用程序,它是针对 .NET 3.5 SP1 构建的。当我尝试在应用程序配置文件中应用上述启动元素时,我遇到了问题。
    • 在MS的帮助下,我找到了一个解决方法,使用COM层作为中间层:social.msdn.microsoft.com/Forums/en/netfxappcompatprerelease/…这个练习的目的是短期补丁;毫无疑问,整个应用程序套件(几个产品)会在以后(我希望很快)转换为目标 .NET 4 运行时。使用变通方法只是给了我一些喘息的空间,并允许我在将应用程序转换为目标 .NET 4 的同时做一些工作。
    • 我将完整的堆栈跟踪放在您的博客上,因为堆栈跟踪太长,无法放入本网站的评论中。 marklio.com/marklio/…
    • Notre - 感谢您的信息。对不起,我没有在我的博客上看到你的评论。显然我的评论通知不起作用。我很高兴 Karel 能够在论坛上为您提供帮助。我会查看堆栈,看看是否有需要记录的重大更改。
    • 为了其他阅读本文的人可能受益,我的自定义应用程序中的问题与我们使用的自定义同步上下文代替标准 WPF 同步上下文有关。这个自定义同步上下文做了一些 .NET 4 运行时不喜欢的奇怪事情,所以我稍后会重新讨论。删除自定义同步上下文后,问题就消失了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    • 2012-09-12
    • 2021-09-25
    • 2020-11-12
    相关资源
    最近更新 更多