在将使用 SlimDX 并因此具有非托管代码的项目转换为 .NET 4.0 时,我遇到了以下错误:
混合模式程序集是针对运行时版本“v2.0.50727”构建的,如果没有额外的配置信息,则无法在 4.0 运行时中加载。
谷歌搜索给了我解决方案,即将它添加到应用程序配置中:
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0"/>
</startup>
</configuration>
我的问题是,useLegacyV2RuntimeActivationPolicy
在做什么?我找不到任何关于它的文档。
经过一段时间(以及更多搜索)后,我找到了 Jomo Fisher 的 this blog entry。
我们最近看到的一个问题是,由于支持并行运行时,.NET 4.0 改变了它绑定到旧混合模式程序集的方式。例如,这些程序集是从 C++\CLI 编译的程序集。当前可用的 DirectX 程序集是混合模式。如果您看到这样的消息,那么您就知道您遇到了问题:混合模式程序集是针对运行时的“v1.1.4322”版本构建的,如果没有其他配置信息,则无法在 4.0 运行时中加载。 [Snip] 应用程序的好消息是,您可以通过设置 app.config 标志来选择回退到 .NET 2.0 时代的这些程序集绑定,如下所示:
所以看起来运行时加载混合模式程序集的方式已经改变。我找不到有关此更改的任何详细信息,也找不到这样做的原因。但 useLegacyV2RuntimeActivationPolicy
属性恢复为 CLR 2.0 加载。
这是我最近写的解释,以帮助解决有关此属性的信息的空白。 http://www.marklio.com/marklio/PermaLink,guid,ecc34c3c-be44-4422-86b7-900900e451f9.aspx(Internet Archive Wayback Machine 链接)
引用最相关的位:
[安装 .NET] v4 是“无影响的”。它不应该在安装时改变现有组件的行为。 useLegacyV2RuntimeActivationPolicy 属性基本上可以让您说:“我对旧版 shim API 有一些依赖关系。请让它们按照他们过去选择的运行时的方式工作。”为什么我们不将此设置为默认行为?您可能会争辩说这种行为更兼容,并且使从以前版本移植代码更加容易。如果您还记得的话,这不可能是默认行为,因为它会使 v4 的安装产生影响,这可能会破坏您机器上安装的现有应用程序。
完整的帖子更详细地解释了这一点。在 RTM,这方面的 MSDN 文档应该更好。
不定期副业成功案例分享