How to reliably detect an installed version of .NET 4.5?

My actual problem is that I came across two versions of the full .NET 4.5 settings:

  • a (possibly) older one that is also available when loading SQL Server data tools
    • size: 50,349,920
    • md5: a5e81d1b3905ada0a6e35fd6c6a2e1f4
  • a (possibly) new one downloaded this morning: http://www.microsoft.com/visualstudio/eng/downloads
    • size: 50,352,408
    • md5: d02dc8b69a702a47c083278938c4d2f1

The version for both settings is 4.5.50709.17929 . Inside, the main difference is the netfx_Full.mzz file, but after extracting the contents using 7-zip, I get a lot of files with the same version, even if the contents of the file are different (I checked about 20 random files from about 426), so I can’t say which one is newer.

Is there a way to reliably determine the actual version of the installed .NET 4.5 runtime, so I can only run the setup if it is really necessary?

Update

I checked all 426 files that have different contents, and they all have the same ProductVersion and FileVersion in both installations. Therefore, checksums of the registry or files are the next step.

Update 2

The version specified in the registry is the same for both settings: 4.5.50709

Update 3

.NET 4.5.2 is now available:

This version of the .NET Framework works side-by-side with the .NET Framework 3.5 Service Pack 1 and earlier, but performs an in-place upgrade for the .NET Framework 4, the .NET Framework 4.5, and the .NET Framework 4.5 0.1.

+49
Oct 19 '12 at 10:03
source share
4 answers

MS recently fixed .NET 4.5 to restore backward compatibility with .NET 4.0 in some scenarios (see http://blogs.msdn.com/b/dotnet/archive/2012/10/17/net-framework-4-5- off-to-a-great-start.aspx ).

MS may have updated the configuration with these changes (so that users upgrading to .NET 4.5 do not encounter a problem with related problems), although I do not know why they will not change the version number in the configuration.

Also, note that there is a difference between the .NET version number and the execution version number specified in System.Environment.Version . The latter is still 4.0.30319. * For .NET 4.5, only the version number changes (with the .NET 4.5 update, as well as with each security update).

Here are some examples of runtime versions seen in the wild:

Base 4.0

  • 4.0.30319.1 = RTM.NET 4.0
  • 4.0.30319.269 = .NET 4.0 on Windows XP SP3, 7, 7 SP1 (with MS12-035 GDR Security Update)
  • 4.0.30319.276 = .NET 4.0 for Windows XP Service Pack 3 (4.0.3).
  • 4.0.30319.296 = .NET 4.0 on Windows XP SP3, 7 (with MS12-074 GDR Security Update)
  • 4.0.30319.544 = .NET 4.0 on Windows XP SP3, 7, 7 SP1 (with MS12-035 LDR Security Update)
  • 4.0.30319.1008 = .NET 4.0 on Windows XP SP3, 7, 7 SP1 (with MS13-052 GDR Security Update)
  • 4.0.30319.1022 = .NET 4.0 on Windows XP SP3, 7, 7 SP1 (with MS14-009 GDR Security Update)
  • 4.0.30319.1026 = .NET 4.0 on Windows XP SP3, 7, 7 SP1 (with MS14-057 GDR Security Update)
  • 4.0.30319.2034 = .NET 4.0 on Windows XP SP3, 7, 7 SP1 (with MS14-009 LDR Security Update)

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 on Windows 8
  • 4.0.30319.18052 = .NET 4.5 on Windows 7 Service Pack 1 64-bit
  • 4.0.30319.18063 = .NET 4.5 on Windows 7 SP1 64-bit (with MS14-009 security update)

4.5.1

  • 4.0.30319.18408 = .NET 4.5.1 on Windows 7 Service Pack 1 64-bit
  • 4.0.30319.18444 = .NET 4.5.1 on Windows 7 SP1 64-bit (with MS14-009 security update)
  • 4.0.30319.34014 = .NET 4.5.1 on Windows 8.1 64-bit

4.5.2

  • 4.0.30319.34209 = .NET 4.5.2 on Windows 7 Service Pack 1 64-bit
  • 4.0.30319.34209 = .NET 4.5.2 on Windows 8.1 64-bit

4.6 and later

  • 4.0.30319.42000

I do not see any .NET updates in my Windows Update history, so I think that update v18010 was installed as part of KB 2756872 .

Update: Obviously, Microsoft updated the installation of .NET 4.5 due to a digital signature error in the initial download. KB 2770445 .

+99
Oct 19 '12 at 10:38
source share
 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 res=@""; 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; } } } 
+2
Dec 05 '15 at 8:29
source share

you can always go to Windows / Microsoft.net / Framework / 4.0.30319 and look at the system.dll file ... right-click the properties and look, go to the details .. will show you the version ... system.dll for 4.5. 2

+1
Feb 09 '16 at 17:34
source share

If someone needs the value of System.Environment.Version for the .net version located in the table (you need to do =Vlookup using excel, etc.)
here plunker I created for this.
enter the link above and you can copy the image of this table:

enter image description here

0
Dec 17 '17 at 8:55
source share



All Articles