.NET 4配置中的“ useLegacyV2RuntimeActivationPolicy”有什么作用?


214

将使用SlimDX(因此具有非托管代码)的项目转换为.NET 4.0时,我遇到以下错误:

混合模式程序集是针对运行时的版本“ v2.0.50727”构建的,如果没有其他配置信息,则无法在4.0运行时中加载。

谷歌搜索为我提供了解决方案,即将其添加到应用程序配置中:

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

我的问题是,这是useLegacyV2RuntimeActivationPolicy怎么回事?我找不到有关它的任何文档。

Answers:


165

经过一段时间(和更多搜索),我发现了Jomo Fisher的此博客条目

我们看到的最近的问题之一是,由于对并行运行时的支持,.NET 4.0改变了它绑定到较旧的混合模式程序集的方式。这些程序集例如是从C ++ \ CLI编译的程序集。当前可用的DirectX程序集是混合模式。如果您看到这样的消息,则说明您已经遇到了问题:

混合模式程序集是针对运行时的版本“ v1.1.4322”构建的,如果没有其他配置信息,则无法在4.0运行时中加载。

[片段]

对于应用程序而言,好消息是,可以通过设置如下的app.config标志来选择回退这些程序集的.NET 2.0时代绑定:

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

因此,运行时加载混合模式程序集的方式看起来已经改变。我找不到有关此更改或其完成原因的任何详细信息。但是,该useLegacyV2RuntimeActivationPolicy属性恢复为CLR 2.0加载。


28
在此值得注意的是,同时marklios的答案(stackoverflow.com/questions/1604663/…)提供了指向他有关此更改的详尽解释的链接。
Steffen Opel 2010年

1
可以在MSDN上找到对此的详尽解释(尽管未明确提及上述解决方案):msdn.microsoft.com/zh-cn/magazine/ee819091.aspx
Mouhammed Soueidane 2014年

如果我将此添加到应用程序的配置和UnitTest项目的配置中,并且在运行测试时仍收到文件加载错误,该怎么办?我应该发布一个新问题吗?
代号Cain

126

这是我最近写的解释,以帮助您消除有关此属性的信息。 http://www.marklio.com/marklio/PermaLink,guid,ecc34c3c-be44-4422-86b7-900900e451f9.aspx(Internet存档Wayback Machine链接)

引用最相关的位:

[安装.NET] v4是“无影响的”。安装后,它不应更改现有组件的行为。

useLegacyV2RuntimeActivationPolicy属性基本上可以让您说:“我对旧的填充API有一些依赖性。请根据选定的运行时使它们按照以前的方式工作。”

我们为什么不将其设置为默认行为?您可能会争辩说这种行为更兼容,并且使从以前版本移植代码更加容易。如果您还记得的话,这不是默认行为,因为它会使v4的安装产生影响,这可能会破坏计算机上已安装的现有应用程序。

完整的帖子对此进行了更详细的说明。在RTM上,有关此的MSDN文档应该更好。


user20493,是否可以将环境变量COMPlus_CLRLoadLogDir设置为一个空目录来运行您的应用程序,该目录对该应用程序具有写访问权限并共享生成的日志(请在共享之前擦洗所有PII)。这可能有助于解释发生了什么。config属性可能不适用于您的应用运行所在的上下文。
Mark Miller

此链接还应该帮助您了解问题所在,以及解决方案正在为您做什么:msdn.microsoft.com/en-us/magazine/ee819091.aspx
Mouhammed Soueidane 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.