Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 什么';使用useLegacyV2RuntimeActivationPolicy和多个SupportedTime之间的区别是什么_.net_Clr_App Config_Clr4.0 - Fatal编程技术网

.net 什么';使用useLegacyV2RuntimeActivationPolicy和多个SupportedTime之间的区别是什么

.net 什么';使用useLegacyV2RuntimeActivationPolicy和多个SupportedTime之间的区别是什么,.net,clr,app-config,clr4.0,.net,Clr,App Config,Clr4.0,以下三种情况(在exe的app.config文件中)之间有什么区别 我已经阅读了微软在它和一些博客上的文档,但我仍然不太清楚到底发生了什么以及何时使用它 编辑 我遇到过这样的情况:第三方应用程序是使用CLR 2编译的(并且也使用遗留COM),而我为应用程序所做的允许扩展是使用CLR 4编译的。因此,重新编译应用程序不是我的选择。我只需要知道这三种场景的影响。useLegacyV2RuntimeActivationPolicy属性有点像是在逃避现实。将其设置为true允许.NET

以下三种情况(在exe的app.config文件中)之间有什么区别






我已经阅读了微软在它和一些博客上的文档,但我仍然不太清楚到底发生了什么以及何时使用它

编辑

我遇到过这样的情况:第三方应用程序是使用CLR 2编译的(并且也使用遗留COM),而我为应用程序所做的允许扩展是使用CLR 4编译的。因此,重新编译应用程序不是我的选择。我只需要知道这三种场景的影响。

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

混合模式程序集是根据运行时版本“v2.0.50727”生成的,如果没有其他配置信息,则无法在4.0运行时中加载

下一个明智的做法是将此类程序集重建到目标.NET4。您要做的最后一件事就是使用该属性


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

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


当您从在CLR 4运行时执行的应用程序中加载以CLR 2运行时为目标的程序集时,
useLegacyV2RuntimeActivationPolicy
选项会更改行为。当设置为
true
时,将使用4.0运行时加载CLR 2程序集。这主要是在CLR 4项目中加载以CLR 2为目标的混合模式程序集时需要的,否则会出现错误。

程序集不需要是
ComVisible
-如果加载以.NET 3.5为目标的C++/CLI程序集,这也是必要的,例如,示例中的Microsoft.SqlServer.BatchParser.dll是SQL Server 2008 R2产品的源代码。它是一个基于.NET 2.0编译的混合模式程序集,您需要将
useLegacyV2RuntimeActivationPolicy
设置为
true
才能从.NET 4.0程序集使用。我已经编辑了您的标题。请看,“,共识是“不,他们不应该”。第三种情况确实是最好的。它有效地解决了这个问题。干得好。这影响了我在生产中的一些东西,所以解决方案帮助我快速修复。
<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>