3

以下三个场景(在 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 编译的。因此,重新编译应用程序不是一个选项我。我只需要知道这三种情况的影响。

4

2 回答 2

4

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

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

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

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

于 2013-05-06T18:23:21.137 回答
2

supportedRuntime指定使用哪个运行时来实际运行和执行应用程序本身。如果将此设置为v4.0,则4.0clr 运行时将用于启动应用程序。添加v2.0v4.0表示您将允许 CLR 2 或 4 运行时实际运行应用程序。

useLegacyV2RuntimeActivationPolicy当您从在 CLR 4 运行时中执行的应用程序中加载面向 CLR 2 运行时的程序集时,该选项会更改行为。当它设置为true时,4.0 运行时将用于加载 CLR 2 程序集。如果您在 CLR 4 项目中加载针对 CLR 2 的混合模式程序集,这主要是必需的,否则您将收到错误消息。

于 2013-05-06T18:23:59.440 回答