saber - ¿Cómo detectar de manera confiable la versión real de.NET 4.5 instalada?
net framework windows 7 64 bits (4)
Mi problema real es que encontré dos versiones de configuraciones completas de .NET 4.5:
- una (posiblemente) más antigua, que también está disponible al descargar herramientas de datos de SQL Server
- tamaño:
50,349,920
- md5:
a5e81d1b3905ada0a6e35fd6c6a2e1f4
- tamaño:
- un (posiblemente) más nuevo descargado esta mañana desde aquí: http://www.microsoft.com/visualstudio/eng/downloads
- tamaño:
50,352,408
- md5:
d02dc8b69a702a47c083278938c4d2f1
- tamaño:
La versión para ambas configuraciones es 4.5.50709.17929
. En el interior, la principal diferencia es el archivo netfx_Full.mzz
, pero después de extraer el contenido con 7-zip, termino con muchos archivos con la misma versión, incluso si el contenido del archivo es diferente (he revisado unos 20 archivos aleatorios de aproximadamente 426), así que realmente no puedo decir cuál es más nuevo.
¿Hay alguna forma de detectar de manera confiable la versión real del tiempo de ejecución de .NET 4.5 instalado, de modo que pueda ejecutar la configuración solo si es realmente necesario?
Actualizar
He comprobado todos los 426 archivos que tienen un contenido diferente, y todos ellos tienen la misma ProductVersion y FileVersion en ambas configuraciones. Por lo tanto, el registro o registro de archivos son el siguiente paso.
Actualización 2
La versión que aparece en el registro es la misma para ambas configuraciones: 4.5.50709
Actualización 3
.NET 4.5.2 ya está disponible:
Esta versión de .NET Framework se ejecuta en paralelo con .NET Framework 3.5 SP1 y versiones anteriores, pero realiza una actualización in situ para .NET Framework 4, .NET Framework 4.5 y .NET Framework 4.5.1.
MS aplicó parches recientemente a .NET 4.5 para restaurar la compatibilidad con versiones anteriores de .NET 4.0 en algunos escenarios (consulte http://blogs.msdn.com/b/dotnet/archive/2012/10/17/net-framework-4-5-off-to-a-great-start.aspx ).
Es posible que MS haya actualizado la configuración con estos cambios (para que los usuarios que actualicen a .NET 4.5 no tengan problemas de compatibilidad), aunque no sé por qué no cambiarían el número de versión en la configuración.
Además, tenga en cuenta que hay una diferencia entre el número de versión de .NET y el número de versión de tiempo de ejecución según lo informado por System.Environment.Version
. Este último aún es 4.0.30319. * Para .NET 4.5, solo cambia el número de revisión (con la actualización .NET 4.5 y también con cada actualización de seguridad).
Aquí hay algunos ejemplos de versiones de tiempo de ejecución observadas en la naturaleza:
Base 4.0
- 4.0.30319.1 = .NET 4.0 RTM
- 4.0.30319.269 = .NET 4.0 en Windows XP SP3, 7, 7 SP1 (con la actualización de seguridad de MS12-035 GDR)
- 4.0.30319.276 = .NET 4.0 en Windows XP SP3 (4.0.3 Runtime update)
- 4.0.30319.296 = .NET 4.0 en Windows XP SP3, 7 (con actualización de seguridad MS12-074 GDR)
- 4.0.30319.544 = .NET 4.0 en Windows XP SP3, 7, 7 SP1 (con actualización de seguridad LDR MS12-035 )
- 4.0.30319.1008 = .NET 4.0 en Windows XP SP3, 7, 7 SP1 (con actualización de seguridad GDR de MS13-052 )
- 4.0.30319.1022 = .NET 4.0 en Windows XP SP3, 7, 7 SP1 (con la actualización de seguridad MS14-009 GDR)
- 4.0.30319.1026 = .NET 4.0 en Windows XP SP3, 7, 7 SP1 (con actualización de seguridad MS14-057 GDR)
- 4.0.30319.2034 = .NET 4.0 en Windows XP SP3, 7, 7 SP1 (con la actualización de seguridad LDR MS14-009 )
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 en Windows 8
- 4.0.30319.18052 = .NET 4.5 en Windows 7 SP1 de 64 bits
- 4.0.30319.18063 = .NET 4.5 en Windows 7 SP1 de 64 bits (con la actualización de seguridad MS14-009 )
4.5.1
- 4.0.30319.18408 = .NET 4.5.1 en Windows 7 SP1 de 64 bits
- 4.0.30319.18444 = .NET 4.5.1 en Windows 7 SP1 de 64 bits (con la actualización de seguridad MS14-009 )
- 4.0.30319.34014 = .NET 4.5.1 en Windows 8.1 de 64 bits
4.5.2
- 4.0.30319.34209 = .NET 4.5.2 en Windows 7 SP1 de 64 bits
- 4.0.30319.34209 = .NET 4.5.2 en Windows 8.1 de 64 bits
4.6 y posteriores
- 4.0.30319.42000
No veo ninguna actualización de .NET en mi historial de actualizaciones de Windows, por lo que supongo que la actualización a v18010 se instaló como parte de KB 2756872 .
Actualización: al parecer, Microsoft actualizó la configuración de .NET 4.5 debido a un error con las firmas digitales en la descarga original. KB 2770445 .
Si alguien necesita el valor System.Environment.Version
comparación con la versión .net, dispuesto en una tabla (es necesario realizar =Vlookup
con Excel, etc ...)
Aquí hay un plunker que he creado para eso.
ingrese el enlace de arriba y podrá copiar la imagen de esta tabla:
siempre puede ir a Windows / Microsoft.net / Framework / 4.0.30319 y mirar el archivo system.dll ... haga clic derecho en las propiedades y vea ir a detalles ... debería mostrarle la versión ... system.dll para 4.5.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 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;
}
}
}