.net - 使用 useLegacyV2RuntimeActivationPolicy 和多个 supportedRuntimes 有什么区别

标签 .net clr app-config clr4.0

以下三种场景(在exe的app.config文件中)有什么区别?

<startup>
  <supportedRuntime version="v4.0" />
  <supportedRuntime version="v2.0" />
</startup>


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


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

我已经阅读了有关它的 MS 文档和一些博客,但我仍然不太清楚究竟发生了什么以及何时使用。

编辑
我遇到这样一种情况,第三方应用程序是使用 CLR 2(并且还使用旧版 COM)编译的,而我为应用程序所做的允许扩展是使用 CLR 4 编译的。因此,重新编译应用程序对我来说不是一个选项.我只需要知道这三种情况的影响。

最佳答案

useLegacyV2RuntimeActivationPolicy 属性有点逃避。将其设置为 true 允许 .NET 4 程序加载混合模式 (C++/CLI) 或 [ComVisible] .NET 程序集,这些程序集在注册表中明确声明它们需要运行时版本 2.0.50727。如果您没有这样的程序集,那将不会有任何区别,它们很少见。明智的做法是不要使用它,需要时您会收到一条错误消息。一个 FileLoadException,其消息如下所示:

Mixed mode assembly is built against version 'v2.0.50727' of the runtime and cannot be loaded in the 4.0 runtime without additional configuration information.

下一个明智的做法是重建此类程序集以面向 .NET 4。您要做的最后一件事是使用该属性。

如果您提供多个版本的 CLR,就像您在前两个代码片段中所做的那样,那么您将获得 EXE 在其 list 中要求的版本。最后一个强制 v4 版本。这意味着您可能会在不同的 .NET 运行时上运行仅在 CLR v2 上测试过的代码。这几乎总会有好结果,v4 与 v2 非常兼容。但他们确实借此机会修复了 v4 中的错误。您可能会不小心依赖于错误的行为。当然非常罕见。

关于.net - 使用 useLegacyV2RuntimeActivationPolicy 和多个 supportedRuntimes 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16404701/

相关文章:

.net - 柯里化(Currying)委托(delegate)参数的最佳模式是什么(使用 .NET 2.0 或更高版本)?

.net - 托管代码优势

.net - 可变结构有什么好的用途?

service - 以管理员权限运行服务

c# - Powershell 加载自定义程序集配置文件

c# - 为什么 Awaiters (async/await) 是结构体而不是类?可以使用类吗?

用 null 初始化的 C# 值类型

.net - EntitySpaces 的文档是否仍然在任何地方可用?

c# - 如何对 LINQ to Objects 查询进行分区?

azure - 覆盖 Azure 网站中的 applicationSettings "MySite.Properties.Settings.MySetting"