System.Environment.Version提供不准确的值

Vin*_*ete 9 .net c#

我有一个简单的问题:当我在Visual Studio 2012中转到HELP-> About时,窗口显示我正在使用的.NET版本是4.5.50709.但是,当我执行以下代码时:

Console.WriteLine(Environment.Version);
Run Code Online (Sandbox Code Playgroud)

我得到版本4.0.30319.18034.是什么赋予了?在Troelsen的Pro C#5和.NET 4.5 Framework(第81页)中,它指出Version属性返回一个表示.NET平台版本的对象.这是不正确的?上一个问题的线程表明此属性返回CLR版本.如果是这种情况,Version对象的目的是什么(例如,知道CLR版本而不是框架版本的用途是什么),以及如何实际获得框架版本?

Dan*_*ker 17

CLR(公共语言运行时)版本是4.0.30319.18034.它从4.0.30319开始,因为.NET 4.5是.NET 4.0程序集的就地升级.

4.5更新完全取代了.NET 4.0运行时,并将实际版本号设置为v4.0.30319.

(来源1,来源2)

但是您的版本号可能代表.NET 4.5并带有一些更新,可能由用户Daniel 从此列表中推断出来:

以下是我见过的运行时版本的一些示例:

  • 4.0.30319.1 = .NET 4.0 RTM
  • 4.0.30319.269 =我们在从用户收集的数据中看到的最常见的.NET 4.0版本
  • 4.0.30319.544 =我们的一小部分用户安装的另一个.NET 4.0版本
  • 4.0.30319.17626 = .NET 4.5 RC
  • 4.0.30319.17929 = .NET 4.5 RTM
  • 4.0.30319.18010 =我的Windows 8计算机上的当前版本

主要版本,次要版本和构建版本号都没有改变,所以我认为他们认为.NET 4.0和4.5之间的区别对于大多数人来说都不够重要.期望某些版本4.0.30319的.NET 4.0应用程序仍然可以在.NET 4.5下按预期工作.


无论您是为.NET 4.0还是4.5编写代码,都要针对完全相同的.NET程序集进行编译.唯一的区别是,在编译.NET 4.0时,隐藏了 .NET 4.5中的一些新类(就好像它们从未存在过).所以说明.NET 4.0和4.5之间区别的唯一可靠方法似乎是Christian.K 在他的帖子中提出的相当黑客的方法,它不涉及版本号:

这个ReflectionContext类似乎是.NET framework 4.5的全新功能,并且可以方便地存在mscorlib.所以你可以这样做.

public static bool IsNet45OrNewer()
{
    // Class "ReflectionContext" exists from .NET 4.5 onwards.
    return Type.GetType("System.Reflection.ReflectionContext", false) != null;
}
Run Code Online (Sandbox Code Playgroud)