Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.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
C# 在.net 4.0上执行应用程序时,在.net 2.0下编译_C#_.net_.net 4.0_.net 2.0_Version - Fatal编程技术网

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

C# 在.net 4.0上执行应用程序时,在.net 2.0下编译,c#,.net,.net-4.0,.net-2.0,version,C#,.net,.net 4.0,.net 2.0,Version,假设: 下面的C#源代码是在.NET2.0(CLR2.0)下编译的;及 上面的应用程序使用下面列出的app.config;及 只有.NET 4.0(CLR 4.0)安装在执行应用程序的客户端的环境中 然后,内部加载哪个版本的.NET以在客户端环境中执行应用程序 描述 下面的控制台应用程序将在控制台中简单地显示其CLR版本是v4.0.30319,但是@Reed Copsey的堆栈()答案显示在这种情况下加载了.NET 2.0。此外,at表示当useLegacyV2RuntimeActivation

假设:

  • 下面的C#源代码是在.NET2.0(CLR2.0)下编译的;及
  • 上面的应用程序使用下面列出的
    app.config
    ;及
  • 只有.NET 4.0(CLR 4.0)安装在执行应用程序的客户端的环境中
  • 然后,内部加载哪个版本的.NET以在客户端环境中执行应用程序

    描述 下面的控制台应用程序将在控制台中简单地显示其CLR版本是
    v4.0.30319
    ,但是@Reed Copsey的堆栈()答案显示在这种情况下加载了.NET 2.0。此外,at表示当
    useLegacyV2RuntimeActivationPolicy
    设置为false
    false
    时:

    使用.NET Framework 4及更高版本的默认激活策略, 允许传统运行时激活技术加载CLR 将版本1.1或2.0导入流程。

    尽管app.config具有.NET4.0配置,但听起来似乎加载了.NET2.0。我误解了什么吗

    来源 C#源代码

    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                string version = Environment.Version.ToString();
                Console.WriteLine(version);
            }
        }
    }
    
    app.config

    <?xml version="1.0"?>
    <configuration>
        <startup useLegacyV2RuntimeActivationPolicy="false">
            <supportedRuntime version="v4.0.30319"/>
        </startup>
    </configuration>
    

    底线是,在您的场景中,您指定.Net 4作为唯一受支持的运行时,因此您的应用程序将加载CLR 4

    程序的CLR行为完全符合设计要求:

    当我将
    supportedRuntime
    作为v4.0运行您的测试应用程序时,Process Explorer显示它加载了mscorlib v4.0.30319

    当我以v2.0.50727的形式运行
    supportedRuntime
    时,Process Explorer显示它加载了mscorlilb v2.0.50727

    当我在没有
    supportedRuntime
    元素的情况下运行时,Process Explorer显示它加载了mscorlilb v2.0.50727

    声明
    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版本将是选择运行应用程序的版本,基于用于编译应用程序的版本,以及列出的支持的运行时(如果有)


    COM组件有一个和一个about.Net 4并排加载和进程中(在Proc SxS中)执行,这也会对没有COM组件的场景产生影响。在.Net 4之前,如果您使用CLR版本编译应用程序,而该版本在运行时在系统上不可用,则如果安装了较新版本的CLR,应用程序将自动在其上运行。从.Net 4开始,除非在
    supportedRuntimes
    元素中指定较新版本的CLR,否则应用程序现在将不会使用较新版本的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、Server2008、Server2008R2。因此,如果你