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
app.config
;及v4.0.30319
,但是@Reed Copsey的堆栈()答案显示在这种情况下加载了.NET 2.0。此外,at表示当useLegacyV2RuntimeActivationPolicy
设置为falsefalse
时:
使用.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。因此,如果你