Короче говоря, вы можете использовать это примерно (см. Ниже для более полного решения):
Microsoft.Win32.Registry.LocalMachine
.OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP")
.GetSubKeyNames().Where(keyname=>Regex.IsMatch(keyname,@"^v\d"))
На моей машине это возвращает: v2.0.50727, v3.0, v3.5, v4, v4.0. Подключи могут быть использованы для обнаружения пакетов обновления (которые, вероятно, актуальны). Кроме того, использование клавиши SOFTWARE\Microsoft\.NETFramework
возвращает v2.0.50727, v3.0 и v4.0.30319 - эххх, прекрасно, немного по-другому!
Нет гарантии, что этот паттерн будет держаться, но это довольно разумная ставка :-). http://support.microsoft.com/kb/318785 содержит дополнительную информацию о реестре, описывающем управление версиями, и, в частности, вам может нужно проверить на Install
- но это сложно, как демонстрирует v4.0.
Редактировать: Я расширил это, чтобы обнаружить произвольные подразделы реестра, которые включают в себя информацию об установке, для правильного определения клиентских и полных профилей v4. Кроме того, тип RegistryKey
- IDisposable
, и похоже, что метод Dispose действительно что-то делает (разблокировка ключа реестра).
var versionList = new List<string>();
using(var ndpKey=Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP")) {
Action<RegistryKey, Action<RegistryKey,string>> processKids = (node, action) => {
foreach(var childname in node.GetSubKeyNames())
using(var child = node.OpenSubKey(childname))
action(child,childname);
};
Action<RegistryKey, Func<RegistryKey, bool>> visitDescendants = null;
visitDescendants = (regkey, isDone) => {
if(!isDone(regkey))
processKids(regkey, (subkey, subkeyname)=>visitDescendants(subkey,isDone));
};
processKids(ndpKey, (versionKey, versionKeyName) => {
if(Regex.IsMatch(versionKeyName,@"^v\d")) {
visitDescendants(versionKey, key => {
bool isInstallationNode = Equals(key.GetValue("Install"), 1) && key.GetValue("Version") != null;
if(isInstallationNode)
versionList.Add(
key.Name.Substring(ndpKey.Name.Length+1)
+ (key.GetValue("SP")!=null ? ", service pack "+ key.GetValue("SP"):"")
+ " ("+key.GetValue("Version") +") "
);
return isInstallationNode;
});
}
});
}
versionList содержит:
v2.0.50727, service pack 2 (2.0.50727.4927)
v3.0, service pack 2 (3.0.30729.4926)
v3.5, service pack 1 (3.5.30729.4926)
v4\Client (4.0.30319)
v4\Full (4.0.30319)