.net - 在应用程序中使用 ‘useLegacyV2RuntimeActivationPolicy’ 和supportedRuntime时出现问题

标签 .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 执行相同的操作,该 .exe 恰好基于 MS CAB(稍作修改),并且混合了 WPF 和 WinForms 内容。一旦我修改了该应用程序的应用程序配置文件,我就开始收到此异常,有时在应用程序启动期间:

The Undo operation encountered a context that is different from what was applied in the corresponding Set operation. The possible cause is that a context was Set on the thread and not reverted(undone). System.InvalidOperationException: The Undo operation encountered a context that is different from what was applied in the corresponding Set operation. The possible cause is that a context was Set on the thread and not reverted(undone).

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

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

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

即我删除了supportedRuntime元素,那么应用程序就不会抛出此异常。但是,当我在代码中尝试加载 .NET 4 程序集时,如果失败并出现以下情况:

System.BadImageFormatException: Could not load file or assembly '' or one of its dependencies. This assembly is built by a runtime newer than the currently loaded runtime and cannot be loaded.

我想这是预料之中的。

我有两个问题:

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

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

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

最佳答案

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

关于无效操作异常,我的猜测是您遇到了框架之间的某种不兼容问题。我确信我们也希望在这方面发现一个错误。您可以分享异常时的堆栈跟踪吗?

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

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

关于.net - 在应用程序中使用 ‘useLegacyV2RuntimeActivationPolicy’ 和supportedRuntime时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2520104/

相关文章:

.net - 在 Web Api 中本地化 OAuth 消息

c++ - 分发 VC++ 运行时文件的正确方法

c# - 确保尽早加载(某些)引用的程序集

powershell - 如何使用 PowerShell 引用 .NET 程序集

linux - 在 Ubuntu 上安装 Eclipse 插件的简单方法

maven - 为什么使用 Maven 版本插件(版本 :use-latest-versions) not updating/changing -SNAPSHOT version to release (none -SNAPSHOT version)?

c# - 这个线程安全吗?

c# - 如何使用简单注入(inject)器模拟模块/安装程序/注册表

C++ : how to link against libA. so 而不是 libA-X.Y.Z.so

c# - 内存分配 : Stack vs Heap?