Как надежно обнаружить установленную версию .NET 4.5?
Моя фактическая проблема заключается в том, что я столкнулся с двумя версиями полных настроек .NET 4.5:
- a (возможно) более старый, который также доступен при загрузке инструментов данных SQL Server
- размер:
50,349,920
- md5:
a5e81d1b3905ada0a6e35fd6c6a2e1f4
- a (возможно) новый, загруженный сегодня утром: http://www.microsoft.com/visualstudio/eng/downloads
- размер:
50,352,408
- md5:
d02dc8b69a702a47c083278938c4d2f1
Версия для обеих настроек - 4.5.50709.17929
. Внутри основное отличие - это файл netfx_Full.mzz
, но после извлечения содержимого с помощью 7-zip я получаю много файлов с одинаковой версией, даже если содержимое файла отличается (я проверил около 20 случайных файлов из около 426), поэтому я не могу сказать, какой из них более новый.
Есть ли способ надежно определить фактическую версию установленной среды выполнения .NET 4.5, поэтому я могу запустить настройку только в том случае, если это действительно необходимо?
Обновление
Я проверил все 426 файлов, которые имеют разное содержимое, и все они имеют одинаковые ProductVersion и FileVersion в обеих установках. Таким образом, контрольные суммы реестра или файлов являются следующим шагом.
Обновление 2
Версия, указанная в реестре, одинакова для обеих настроек: 4.5.50709
Обновление 3
.NET 4.5.2 теперь доступен:
Эта версия .NET Framework работает бок о бок с .NET Framework 3.5 с пакетом обновления 1 (SP1) и более ранних версий, но выполняет обновление на месте для .NET Framework 4,.NET Framework 4.5 и .NET Framework 4.5 0,1.
Ответы
Ответ 1
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, не столкнулись с проблемой сопутствующих проблем), хотя я не знаю, почему они не изменят номер версии в настройке.
Кроме того, обратите внимание, что существует разница между номером версии .NET и номером версии выполнения, указанным в System.Environment.Version
. Последнее по-прежнему составляет 4.0.30319. * Для .NET 4.5 изменяется только номер версии (с обновлением .NET 4.5, а также с каждым обновлением безопасности).
Вот несколько примеров версий среды исполнения, наблюдаемых в дикой природе:
База 4.0
- 4.0.30319.1 = RTM.NET 4.0
- 4.0.30319.269 =.NET 4.0 в Windows XP SP3, 7, 7 SP1 (с MS12-035 Обновление безопасности GDR)
- 4.0.30319.276 =.NET 4.0 для Windows XP с пакетом обновления 3 (SP3) (4.0.3).
- 4.0.30319.296 =.NET 4.0 в Windows XP SP3, 7 (с MS12-074 Обновление безопасности GDR)
- 4.0.30319.544 =.NET 4.0 в Windows XP SP3, 7, 7 SP1 (с MS12-035 Обновление безопасности LDR)
- 4.0.30319.1008 =.NET 4.0 на Windows XP SP3, 7, 7 SP1 (с MS13-052 Обновление безопасности GDR)
- 4.0.30319.1022 =.NET 4.0 в Windows XP SP3, 7, 7 SP1 (с MS14-009 Обновление безопасности GDR)
- 4.0.30319.1026 =.NET 4.0 в Windows XP SP3, 7, 7 SP1 (с MS14-057 Обновление безопасности GDR)
- 4.0.30319.2034 =.NET 4.0 в Windows 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 =.NET 4.5 в Windows 7 с пакетом обновления 1 (SP1) 64-разрядный
- 4.0.30319.18063 =.NET 4.5 в Windows 7 SP1 64-разрядный (с MS14-009 обновление для системы безопасности)
4.5.1
- 4.0.30319.18408 =.NET 4.5.1 в Windows 7 с пакетом обновления 1 (SP1) 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 с пакетом обновления 1 (SP1) 64-разрядный
- 4.0.30319.34209 =.NET 4.5.2 на Windows 8.1 64-разрядный
4.6 и более поздних
Я не вижу никаких обновлений .NET в моей истории Windows Update, поэтому я думаю, что обновление v18010 было установлено как часть KB 2756872.
Обновление: очевидно, Microsoft обновила установку .NET 4.5 из-за ошибки с цифровыми подписями в исходной загрузке. KB 2770445.
Ответ 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;
}
}
}
Ответ 3
вы всегда можете перейти в Windows/Microsoft.net/Framework/4.0.30319 и посмотреть файл system.dll... щелкните правой кнопкой мыши свойства и посмотрите, перейдите к деталям.. покажет вам версию...
system.dll для 4.5.2
Ответ 4
Если кому-то нужно значение System.Environment.Version
для версии .net, расположенное в таблице (необходимо выполнить =Vlookup
с помощью excel и т.д.)
здесь plunker Я создал для этого.
введите ссылку выше, и вы сможете скопировать изображение этой таблицы:
![введите описание изображения здесь]()