使用useLegacyV2RuntimeActivationPolicy和多个supportedRuntimes之间的区别是什么

时间:2013-05-06 18:16:55

标签: .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编译的。因此,重新编译应用程序对我来说不是一个选项。我只需要知道三种情景的影响。

2 个答案:

答案 0 :(得分: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非常兼容。但他们确实借此机会修复了第4版中的错误。你可能会意外地依赖有缺陷的行为。当然非常罕见。

答案 1 :(得分:2)

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

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