以下三种场景(在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。如果你没有这样的组件也不会有任何区别,它们是相当罕见的。同样的做法是不使用它,当需要它时,您将得到一条错误消息。fileloadeexception,其消息如下:
混合模式程序集是基于运行时版本'v2.0.50727'构建的,如果没有额外的配置信息,则无法在4.0运行时中加载。
接下来要做的事情是重新构建这样的程序集以瞄准。net 4。你要做的最后一件事就是使用这个属性。
如果你提供了一个以上的CLR版本,就像你在前两个片段中所做的那样,那么你将得到EXE在其清单中要求的那个。最后一个强制使用v4版本。这意味着您可能会在不同的。net运行时上运行只在CLR v2上测试过的代码。这几乎总是会有好的结果,v4和v2是非常兼容的。但他们确实利用这个机会修复了v4中的bug。您可能会意外地依赖于有bug的行为。当然非常罕见。
supportedRuntime
指定用于实际运行和执行应用程序本身的运行时。如果将其设置为v4.0
,则将使用4.0
clr运行时来启动应用程序。添加v2.0
和v4.0
表示您将允许clr2或4运行时实际运行应用程序。
useLegacyV2RuntimeActivationPolicy
选项更改从在CLR 4运行时执行的应用程序中加载以CLR 2运行时为目标的程序集时的行为。当它被设置为true
时,4.0运行时将用于加载clr2程序集。如果您在CLR 4项目中加载针对CLR 2的混合模式程序集,这主要是必需的,否则您将得到一个错误。