Nicht zu schlagen die deadhorse, jedoch suche ich nach einer Möglichkeit, die installierten .NET-Frameworks zu erkennen. Es scheint so, als ob die bereitgestellten Lösungen (in den Links) alle gut sind bis zu dem Punkt, an dem eine neue Version des Frameworks veröffentlicht wird und dann alle Wetten aus sind. Der Grund dafür ist, dass die Erkennung auf den Registrierungsschlüsseln beruht und es scheint, dass v4 des Frameworks die Konvention gebrochen hat und man jetzt zusätzliche Schritte unternehmen muss, um v4 zu erkennen.Zukunftssichere .NET-Versionserkennung
Gibt es eine Möglichkeit das .NET Framework zu erkennen, die auch funktionieren, wenn .NET v5 erscheint.
EDIT: Ok, für zukünftige Generationen von frustrierten Sucher .NET Version, hier ist der Code, um sie geschehen:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Diagnostics;
using Microsoft.Win32;
private List<string> GetInstalledDotNetFrameworks()
{
string key = string.Empty;
string version = string.Empty;
List<string> frameworks = new List<string>();
var matches = Registry.LocalMachine
.OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP")
.GetSubKeyNames().Where(keyname => Regex.IsMatch(keyname, @"^v\d"));
// special handling for v4.0 (deprecated) and v4 (has subkeys with info)
foreach (var item in matches)
{
switch (item)
{
case "v4.0": // deprecated - ignore
break;
case "v4":// get more info from subkeys
key = @"SOFTWARE\Microsoft\NET Framework Setup\NDP\" + item;
string[] subkeys = Registry.LocalMachine
.OpenSubKey(key)
.GetSubKeyNames();
foreach (var subkey in subkeys)
{
key = @"SOFTWARE\Microsoft\NET Framework Setup\NDP\" + item + @"\" + subkey;
version = Registry.LocalMachine
.OpenSubKey(key)
.GetValue("Version").ToString();
version = string.Format("{0} ({1})", version, subkey);
frameworks.Add(version);
}
break;
case "v1.1.4322": // special case, as the framework does not follow convention
frameworks.Add(item);
break;
default:
try
{
// get the Version value
key = @"SOFTWARE\Microsoft\NET Framework Setup\NDP\" + item;
version = Registry.LocalMachine
.OpenSubKey(key)
.GetValue("Version").ToString();
frameworks.Add(version);
}
catch
{
// most likely new .NET Framework got introduced and broke the convention
}
break;
}
}
// sort the list, just in case the registry was not sorted
frameworks.Sort();
return frameworks;
}
Danke, ich wusste nicht über diesen Registrierungsschlüssel - dachte, ich musste zu HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ NET Framework Setup \ NDP gehen. Ich denke, das könnte den Trick machen. – AngryHacker
Sorry, das hat nicht wirklich funktioniert. Software/Microsoft/.NETFramework listet v3.5 nicht auf – AngryHacker
Behoben - ich verwende jetzt den NDP-Registrierungsschlüssel. –