2012-10-19 87 views
49

我实际的问题是,我曾经遇到过的.NET 4.5全设置两个版本:如何可靠地检测安装的实际.NET 4.5版本?

  • (可能)旧的一个,下载SQL Server数据工具时,它也可
    • 大小:50,349,920
    • MD5:a5e81d1b3905ada0a6e35fd6c6a2e1f4
  • (可能)较新的一个早上下载从这里:http://www.microsoft.com/visualstudio/eng/downloads
    • 大小:50,352,408
    • MD5:d02dc8b69a702a47c083278938c4d2f1

的版本都设置为4.5.50709.17929。内饰方面,主要区别是netfx_Full.mzz文件,但解压7-ZIP我结束了很多的文件具有相同的版本,即使该文件的内容是不同的内容之后(我已经从约426查了一下20个随机文件),所以我不能确定哪一个更新。

有没有一种方法能够可靠地检测已安装的.NET 4.5运行时的实际版本,所以我只能跑,如果它是真正所需的设置?

更新

我已经检查了所有的426个文件有不同的内容,所有这些都具有两种设置相同的ProductVersion和文件版本。所以,注册表或文件校验和是下一步。

更新2

注册表中列出的版本是两种设置相同:4.5.50709

更新3

.NET 4.5.2现已:

这.NET Framework的版本以side-by-sid运行e使用.NET Framework 3.5 SP1及更早版本,但为.NET Framework 4,.NET Framework 4.5和.NET Framework 4.5.1执行就地更新。

+2

如果它们都安装某种形式.net4.5的,你有什么问题? 您可以使用注册表'HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ NET Framework Setup \ NDP'检查'net 4.5' – wal

+0

我希望安装最新的版本,同时避免重新安装“只是为了确保”。查看丹尼尔的答案是使用最新版本的最佳理由。 – alexandrul

+1

好吧,我现在可以建议的唯一事情就是同时安装两个版本,或者在不同的机器上安装这两个版本,并比较该位置的注册表(因为您已经说过这两个版本的安装版本相同) - 还有一件事,是否有可能您的客户或正在安装的人将会使用SQL Server数据工具附带的.net4.5安装程序? – wal

回答

103

MS最近修补.NET 4.5还原向后与.NET 4.0在某些情况下(见http://blogs.msdn.com/b/dotnet/archive/2012/10/17/net-framework-4-5-off-to-a-great-start.aspx)的兼容性。

这有可能是MS更新这些变化的设置(以便用户升级到.NET 4.5没有碰到麻烦COMPAT),虽然我不知道为什么他们不会改变对安装的版本号。

另外,还要注意有.NET版本号和所报告的System.Environment.Version运行时版本号之间的差异。后者仍然是4.0.30319。*的.NET 4.5中,只有版本号的变化(与.NET 4.5的更新,同时还与每个安全更新)。

这里是在野外观察到的运行时版本的一些例子:

基地4.0

  • 4.0.30319.1 = .NET 4.0 RTM
  • 4.0.30319.269 =在Windows .NET 4.0 XP SP3,7,7 SP1(与MS12-035 GDR安全更新)
  • 4.0.30319.276 = Windows XP SP3上的.NET 4.0(4.0.3运行时更新)
  • 4.0.30319.296在Windows XP SP3 = .NET 4.0,7(与MS12-074 GDR安全更新)
  • 4.0.30319.544 = .NET 4.0在Windows XP SP3,7,7 SP1(含MS12-035 LDR安全更新)
  • 4.0.30319.1008 = Windows XP SP3,7,7 SP1上的.NET 4.0(使用MS13-052 GDR安全更新)
  • 4.0.30319.1022 = Windows XP SP3,7,7 SP1上的.NET 4.0(MS14-009 GDR安全更新)
  • 4.0.30319.1026 = Windows XP SP3,7,7 SP1上的.NET 4.0(带有MS14-057 GDR安全更新)
  • 4.0.30319.2034 = Win 4.0上的.NET 4.0 DOWS XP SP3,7,7 SP1(用MS14-009 LDR安全更新)

4.5

  • 4.0.30319.17626 = .NET 4.5 RC
  • 4.0.30319.17929 = .NET 4.5 RTM
  • 4.0.30319.18010 = .NET 4.5在Windows 8
  • 4.0.30319.18052在Windows 7 SP1 64位
  • 4.0.30319 = .NET 4.5。 18063 = .NET 4.5在Windows 7 SP1 64位(与MS14-009安全更新)在Windows 7 SP1

4.5.1

  • 4.0.30319.18408 = .NET 4.5.1 64-位
  • 4.0.30319.18444 = .NET 4.5.1在Windows 7 SP1 64位(与MS14-009安全更新)
  • 4.0.30319.34014 = .NET 4.5.1在Windows 8.1 64位

4.5.2

  • 4.0.30319.34209 = .NET 4.5.2在Windows 7 SP1 64位
  • 4.0.30319.34209 =在Windows 8.1 .NET 4.5.2 64位

4.6和更高

  • 4.0.30319。42000

我看不到我的Windows更新历史上任何.NET更新,所以我想更新v18010得到安装为KB 2756872一部分。

更新:显然微软更新了.NET 4.5安装程序,因为原始下载中的数字签名存在错误。 KB 2770445

+0

首先,非常感谢您提供的信息(来自我的大+1)。我知道System.Environment.Version“问题”,我可以接受它。由于我更容易运行更新的安装程序而不是查找修补程序,因此我有兴趣检测是否需要运行“最新”设置(检查给定dll/exe的md5总和不是很可靠)。 – alexandrul

+0

包含在这两个设置中的很多文件都是'4.0.30319.17929'。 – alexandrul

+0

4.0.30319.544是.NET 4.0的安全更新:http://support.microsoft.com/kb/2604121 – BrianH

2
public class DA { 
    public static class VersionNetFramework { 
     public static string Get45or451FromRegistry() 
     {//https://msdn.microsoft.com/en-us/library/hh925568(v=vs.110).aspx 
      using (RegistryKey ndpKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).OpenSubKey("SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v4\\Full\\")) 
      { 
       int releaseKey = Convert.ToInt32(ndpKey.GetValue("Release")); 
       if (true) 
       { 
        return (@"Version: " + CheckFor45DotVersion(releaseKey)); 
       } 
      } 
     } 
     // Checking the version using >= will enable forward compatibility, 
     // however you should always compile your code on newer versions of 
     // the framework to ensure your app works the same. 
     private static string CheckFor45DotVersion(int releaseKey) 
     {//https://msdn.microsoft.com/en-us/library/hh925568(v=vs.110).aspx 
      if (releaseKey >= 394271) 
       return "4.6.1 installed on all other Windows OS versions or later"; 
      if (releaseKey >= 394254) 
       return "4.6.1 installed on Windows 10 or later"; 
      if (releaseKey >= 393297) 
       return "4.6 installed on all other Windows OS versions or later"; 
      if (releaseKey >= 393295) 
       return "4.6 installed with Windows 10 or later"; 
      if (releaseKey >= 379893) 
       return "4.5.2 or later"; 
      if (releaseKey >= 378758) 
       return "4.5.1 installed on Windows 8, Windows 7 SP1, or Windows Vista SP2 or later"; 
      if (releaseKey >= 378675) 
       return "4.5.1 installed with Windows 8.1 or later"; 
      if (releaseKey >= 378389) 
       return "4.5 or later"; 

      return "No 4.5 or later version detected"; 
     } 
     public static string GetVersionFromRegistry() 
     {//https://msdn.microsoft.com/en-us/library/hh925568(v=vs.110).aspx 
      string res = @""; 
      // Opens the registry key for the .NET Framework entry. 
      using (RegistryKey ndpKey = 
       RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, ""). 
       OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP\")) 
      { 
       // As an alternative, if you know the computers you will query are running .NET Framework 4.5 
       // or later, you can use: 
       // using (RegistryKey ndpKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, 
       // RegistryView.Registry32).OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP\")) 
       foreach (string versionKeyName in ndpKey.GetSubKeyNames()) 
       { 
        if (versionKeyName.StartsWith("v")) 
        { 

         RegistryKey versionKey = ndpKey.OpenSubKey(versionKeyName); 
         string name = (string)versionKey.GetValue("Version", ""); 
         string sp = versionKey.GetValue("SP", "").ToString(); 
         string install = versionKey.GetValue("Install", "").ToString(); 
         if (install == "") //no install info, must be later. 
          res += (versionKeyName + " " + name) + Environment.NewLine; 
         else 
         { 
          if (sp != "" && install == "1") 
          { 
           res += (versionKeyName + " " + name + " SP" + sp) + Environment.NewLine; 
          } 

         } 
         if (name != "") 
         { 
          continue; 
         } 
         foreach (string subKeyName in versionKey.GetSubKeyNames()) 
         { 
          RegistryKey subKey = versionKey.OpenSubKey(subKeyName); 
          name = (string)subKey.GetValue("Version", ""); 
          if (name != "") 
           sp = subKey.GetValue("SP", "").ToString(); 
          install = subKey.GetValue("Install", "").ToString(); 
          if (install == "") //no install info, must be later. 
           res += (versionKeyName + " " + name) + Environment.NewLine; 
          else 
          { 
           if (sp != "" && install == "1") 
           { 
            res += (" " + subKeyName + " " + name + " SP" + sp) + Environment.NewLine; 
           } 
           else if (install == "1") 
           { 
            res += (" " + subKeyName + " " + name) + Environment.NewLine; 
           } 
          } 
         } 
        } 
       } 
      } 
      return res; 
     } 
     public static string GetUpdateHistory() 
     {//https://msdn.microsoft.com/en-us/library/hh925567(v=vs.110).aspx 
      string [email protected]""; 
      using (RegistryKey baseKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).OpenSubKey(@"SOFTWARE\Microsoft\Updates")) 
      { 
       foreach (string baseKeyName in baseKey.GetSubKeyNames()) 
       { 
        if (baseKeyName.Contains(".NET Framework") || baseKeyName.StartsWith("KB") || baseKeyName.Contains(".NETFramework")) 
        { 

         using (RegistryKey updateKey = baseKey.OpenSubKey(baseKeyName)) 
         { 
          string name = (string)updateKey.GetValue("PackageName", ""); 
          res += baseKeyName + " " + name + Environment.NewLine; 
          foreach (string kbKeyName in updateKey.GetSubKeyNames()) 
          { 
           using (RegistryKey kbKey = updateKey.OpenSubKey(kbKeyName)) 
           { 
            name = (string)kbKey.GetValue("PackageName", ""); 
            res += (" " + kbKeyName + " " + name) + Environment.NewLine; 

            if (kbKey.SubKeyCount > 0) 
            { 
             foreach (string sbKeyName in kbKey.GetSubKeyNames()) 
             { 
              using (RegistryKey sbSubKey = kbKey.OpenSubKey(sbKeyName)) 
              { 
               name = (string)sbSubKey.GetValue("PackageName", ""); 
               if (name == "") 
                name = (string)sbSubKey.GetValue("Description", ""); 
               res += (" " + sbKeyName + " " + name) + Environment.NewLine; 
              } 
             } 
            } 
           } 
          } 
         } 

        } 
       } 
      } 
      return res; 
     } 
    } 
} 
1

你可以随时去到Windows/Microsoft.net /框架/ 4.0.30319并期待在system.dll中文件...点击右键属性,并查看到details..should告诉你的版本... system.dll for 4.5.2

+0

你确定这是真的吗?我看了,.NET DLL有不同的版本号。** 2016年3月9日:** system.dll是4.0.30319.34239,而System.Web.Dll是4.0.30319.34274。最好将“文件版本”列添加到资源管理器中,然后按此排序。 –

0

如果有人需要对.NET版本的System.Environment.Version值,安排在一个表(需要用Excel等进行=Vlookup ...)
这里是一个plunker我为创建。
输入上面的链接,你将能够复制此表图片:

enter image description here

相关问题