在.net 4.0上执行应用程序时,在.net 2.0下编译

Jin*_*ung 20 .net c# version .net-4.0 .net-2.0

假如说:

  1. 下面的C#源代码是在.NET 2.0(CLR 2.0)下编译的; 和
  2. 以上申请使用app.config下面列出的; 和
  3. 只有.NET 4.0(CLR 4.0)安装在执行应用程序的客户端的环境中,

然后在内部加载哪个版本的.NET来在客户端环境中执行应用程序?

描述

下面的控制台应用程序将只显示其CLR版本v4.0.30319在控制台中,但@Reed Copsey对堆栈的回答(CLR 2.0与4.0性能?)表明在这种情况下加载了.NET 2.0.此外,在MSDN上,它表示何时useLegacyV2RuntimeActivationPolicy设置为false false:

使用.NET Framework 4及更高版本的默认激活策略, 即允许旧版运行时激活技术将CLR版本1.1或2.0加载到该过程中.

尽管app.config有.NET 4.0配置,但听起来像是加载了.NET 2.0 .我误解了什么吗?

资源

C#源代码

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string version = Environment.Version.ToString();
            Console.WriteLine(version);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

app.config

<?xml version="1.0"?>
<configuration>
    <startup useLegacyV2RuntimeActivationPolicy="false">
        <supportedRuntime version="v4.0.30319"/>
    </startup>
</configuration>
Run Code Online (Sandbox Code Playgroud)

nek*_*kno 38

最重要的是,在您的方案中,您将.Net 4指定为唯一受支持的运行时,因此您的应用程序将加载CLR 4.

您的程序的CLR行为与设计完全一致:

当我使用supportedRuntimeas v4.0 运行测试应用程序时,Process Explorer显示它加载mscorlib v4.0.30319.

当我以supportedRuntimev2.0.50727 运行时,Process Explorer显示它加载mscorlilb v2.0.50727.

当我没有supportedRuntime元素运行时,Process Explorer显示它加载mscorlilb v2.0.50727.

Microsoft的这个模糊声明该supportedRuntime元素定义了程序运行的特定版本:

默认情况下,应用程序在为其构建的.NET Framework版本上运行.如果该版本不存在且应用程序配置文件未定义支持的版本,则可能发生.NET Framework初始化错误.在这种情况下,运行应用程序的尝试将失败.

要定义运行应用程序的特定版本,请将一个或多个元素添加到应用程序的配置文件中.每个元素都列出了运行时支持的版本,第一个指定了最喜欢的版本,最后一个指定了最不喜欢的版本.


这里有两个独立的元素在起作用.只有该supportedRuntime元素适用于您的方案.

supportedRuntime元素按首选顺序定义应用程序将运行的CLR版本.如果列出支持的运行时,则将使用这些CLR版本,从上到下列表,直到找到已安装的CLR版本.如果您没有列出支持运行时,那么您的程序将使用与其编译的CLR版本运行.

useLegacyV2RuntimeActivationPolicy元素仅适用于混合模式程序集 - 包含托管(.Net)和非托管(本机)代码的程序或DLL.您的示例程序不是混合模式程序集.对于混合模式程序集,将值设置为false(默认值)或不设置全部,使用新的.Net 4进程内并行加载混合模式程序集,因此您的应用程序可以使用CLR 4运行,并使用CLR 1.0-2.0在同一进程中加载​​混合模式程序集.将其设置为true基本上恢复到.Net 4之前的先前功能,其中禁用进程内并排功能,并且选择运行应用程序的任何CLR版本将尝试加载混合模式程序集.用于加载混合模式程序集的CLR版本将根据用于编译应用程序的版本以及列出的支持的运行时(如果有)来选择运行应用程序.


有一篇MSDN杂志文章一篇关于COM组件的.Net 4加载和进程内并行(In-Proc SxS)执行的MSDN文章,它们对没有COM组件的场景也有影响.在.Net 4之前,如果您使用CLR版本编译应用程序,并且该版本在运行时在系统上不可用,则应用程序将自动在较新版本的CLR上运行(如果已安装).从.Net 4开始,除非您在supportedRuntimes元素中指定较新版本,否则应用程序现在不会使用较新版本的CLR运行.

以下是MSDN文章的引用:

应用开发者.并行托管对应用程序开发人员几乎没有影响.默认情况下,应用程序始终针对它们构建的.NET Framework版本运行; 这没有改变.但是,开发人员可以覆盖此行为并指示应用程序在较新版本的.NET Framework下运行(请参阅方案2).

图书馆开发者和消费者 并行托管并不能解决库开发人员面临的兼容性问题.由应用程序直接加载的库(通过直接引用或通过Assembly.Load调用)继续使用它加载到的AppDomain的运行时.您应该针对要支持的所有.NET Framework版本测试库.如果使用.NET Framework 4运行时编译应用程序但包含使用早期运行时构建的库,则该库也将使用.NET Framework 4运行时.但是,如果您的应用程序是使用早期运行时和使用.NET Framework 4构建的库构建的,则必须强制您的应用程序也使用.NET Framework 4(请参阅方案3).

最后,如果您使用的是Vista,Win7,Server 2008,Server 2008 R2,则会自动安装CLR 2.0.因此,如果要删除supportedRuntimes元素或将其更改为v2.0.50727,则可能仍将CLR 2.0作为运行时提供.

.Net运行时