¿Cómo detecto qué versiones de .NET Framework y service packs están instalados?

289

Aquí se hizo una pregunta similar , pero era específica de .NET 3.5. Específicamente, estoy buscando lo siguiente:

  1. ¿Cuál es la forma correcta de determinar qué versiones de .NET Framework y service packs están instalados?
  2. ¿Hay una lista de claves de registro que se pueden usar?
  3. ¿Hay alguna dependencia entre las versiones de Framework?
Scott Dorman
fuente
2
Esta pregunta está estrechamente relacionada con stackoverflow.com/questions/198931/… y stackoverflow.com/questions/182910/…
Pascal Paradis el
Sí lo es. Ya sabía sobre el primero (es al que me refiero en mi pregunta). No sabía sobre el otro.
Scott Dorman
3
Estoy impresionado de cómo esta pregunta (incluidas las respuestas) y todas las preguntas estrechamente relacionadas ignoran por completo la presencia de los valores de SKU ; esto incluso diferencia entre 4.5 y 4.5.1.
springy76
@ springy76, la razón por la que esto no aborda la presencia de valores SKU es porque, a los efectos de determinar qué versiones de Framework están instaladas, no son relevantes. La pregunta a la que hace referencia en realidad está tratando de determinar si está instalado ".NET 4.0.2". El problema aquí es que no había .NET 4.0.2, era una actualización (KB2544514), no una versión de Framework o un service pack. Puede consultar este artículo en MSDN ( msdn.microsoft.com/en-us/library/hh925567(v=vs.110).aspx ) para obtener más información sobre cómo detectar qué actualizaciones están instaladas.
Scott Dorman

Respuestas:

365

El registro es la forma oficial de detectar si está instalada una versión específica del Framework.

ingrese la descripción de la imagen aquí

Las claves de registro que se necesitan cambiar según la versión de Framework que esté buscando:

Clave de registro de versión de marco
-------------------------------------------------- ----------------------------------------
1.0 HKLM \ Software \ Microsoft \ .NETFramework \ Policy \ v1.0 \ 3705 
1.1 HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v1.1.4322 \ Instalar 
2.0 HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v2.0.50727 \ Instalar 
3.0 HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v3.0 \ Setup \ InstallSuccess 
3.5 HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v3.5 \ Install 
4.0 Perfil del cliente HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Client \ Install
4.0 Full Profile HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Full \ Install

Generalmente buscas:

"Install"=dword:00000001

excepto .NET 1.0, donde el valor es una cadena ( REG_SZ) en lugar de un número ( REG_DWORD).

La determinación del nivel del service pack sigue un patrón similar:

Clave de registro de versión de marco
-------------------------------------------------- ----------------------------------------
1.0 HKLM \ Software \ Microsoft \ Active Setup \ Componentes instalados \ {78705f0d-e8db-4b2d-8193-982bdda15ecd} \ Versión 
1.0 [1] HKLM \ Software \ Microsoft \ Configuración activa \ Componentes instalados \ {FDC11A6F-17D1-48f9-9EA3-9051954BAA24} \ Versión 
1.1 HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v1.1.4322 \ SP 
2.0 HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v2.0.50727 \ SP 
3.0 HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v3.0 \ SP 
3.5 HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v3.5 \ SP 
4.0 Perfil del cliente HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Client \ Servicing
4.0 Perfil completo HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Full \ Servicing

[1] Windows Media Center o Windows XP Tablet Edition

Como puede ver, determinar el nivel de SP para .NET 1.0 cambia si está ejecutando Windows Media Center o Windows XP Tablet Edition. Nuevamente, .NET 1.0 usa un valor de cadena mientras que todos los demás usan un DWORD.

Para .NET 1.0, el valor de la cadena en cualquiera de estas claves tiene un formato de #, #, ####, #. El último # es el nivel de Service Pack.

Si bien no solicité explícitamente esto, si desea conocer el número de versión exacto de Framework, usaría estas claves de registro:

Clave de registro de versión de marco
-------------------------------------------------- ----------------------------------------
1.0 HKLM \ Software \ Microsoft \ Active Setup \ Componentes instalados \ {78705f0d-e8db-4b2d-8193-982bdda15ecd} \ Versión 
1.0 [1] HKLM \ Software \ Microsoft \ Configuración activa \ Componentes instalados \ {FDC11A6F-17D1-48f9-9EA3-9051954BAA24} \ Versión 
1.1 HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v1.1.4322 
2.0 [2] HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v2.0.50727 \ Versión 
2.0 [3] HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v2.0.50727 \ Increment
3.0 HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v3.0 \ Version 
3.5 HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v3.5 \ Version 
4.0 Perfil del cliente HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Version 
4.0 Perfil completo HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Version 

[1] Windows Media Center o Windows XP Tablet Edition
[2] .NET 2.0 SP1
[3] .NET 2.0 Original Release (RTM)

Nuevamente, .NET 1.0 usa un valor de cadena mientras que todos los demás usan un DWORD.

Notas adicionales

  • para .NET 1.0, el valor de cadena en cualquiera de estas claves tiene un formato de #,#,####,#. La #,#,####parte de la cadena es la versión de Framework.

  • para .NET 1.1, usamos el nombre de la clave de registro en sí, que representa el número de versión.

  • Finalmente, si observa las dependencias, .NET 3.0 agrega funcionalidad adicional a .NET 2.0, por lo que tanto .NET 2.0 como .NET 3.0 deben evacuarse como instalados para decir correctamente que .NET 3.0 está instalado. Del mismo modo, .NET 3.5 agrega una funcionalidad adicional a .NET 2.0 y .NET 3.0, por lo que .NET 2.0, .NET 3.0 y .NET 3. deberían evaluar su instalación para decir correctamente que .NET 3.5 está instalado.

  • .NET 4.0 instala una nueva versión de CLR (CLR versión 4.0) que puede ejecutarse en paralelo con CLR 2.0.

Actualización para .NET 4.5

No habrá una v4.5clave en el registro si está instalado .NET 4.5. En su lugar, debe verificar si la HKLM\Software\Microsoft\NET Framework Setup\NDP\v4\Fullclave contiene un valor llamado Release. Si este valor está presente, se instala .NET 4.5; de lo contrario, no lo está. Más detalles se pueden encontrar aquí y aquí .

Scott Dorman
fuente
1
Esto no parece funcionar para .NET 1.1 en Vista x64. No hay claves v1.1.x en ninguno de los lugares posibles. Ideas?
Chris Hynes
77
Las claves para .NET 4.0 no son del todo correctas. Estoy viendo estas claves: HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Client \ Install HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Full \ Install La carpeta v4.0 solo tiene una clave , (Predeterminado) con un valor de obsoleto.
RandomEngy
2
Esta publicación no cubre 4.5, y 4.5 no figura en el registro a pesar de que está instalado.
Klas Mellbourn
37
Hombre, ¿nadie en Microsoft pensó agregar un interruptor de versión?
gnuchu
2
Es una broma. ¡No puedo creer que sea muuuy tonto!
Alex Byrth
17

Hay una respuesta oficial de Microsoft a esta pregunta en el siguiente artículo de la base de conocimiento:

ID del artículo: 318785 - Última revisión: 7 de noviembre de 2008 - Revisión: 20.1 Cómo determinar qué versiones de .NET Framework están instaladas y si se han aplicado paquetes de servicio

Desafortunadamente, no parece funcionar, porque la versión mscorlib.dll en el directorio 2.0 tiene una versión 2.0, y no hay una versión mscorlib.dll en los directorios 3.0 o 3.5 aunque esté instalado 3.5 SP1 ... por qué ¿La respuesta oficial de Microsoft estaría tan mal informada?

luego
fuente
2
+1: parece que Microsoft puede haber actualizado esa página desde que la vinculó originalmente. Parece que podría ser una de las mejores fuentes oficiales sobre el tema.
jpierson
2
Solo sube a 4.0
user316117
16

La versión beta de Framework 4 se instala en una clave de registro diferente.

using System;
using System.Collections.ObjectModel;
using Microsoft.Win32;

class Program
{
    static void Main(string[] args)
    {
        foreach(Version ver in InstalledDotNetVersions())
            Console.WriteLine(ver);

        Console.ReadKey();
    }


    public static Collection<Version> InstalledDotNetVersions()
    {
        Collection<Version> versions = new Collection<Version>();
        RegistryKey NDPKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP");
        if (NDPKey != null)
        {
            string[] subkeys = NDPKey.GetSubKeyNames();
            foreach (string subkey in subkeys)
            {
                GetDotNetVersion(NDPKey.OpenSubKey(subkey), subkey, versions);
                GetDotNetVersion(NDPKey.OpenSubKey(subkey).OpenSubKey("Client"), subkey, versions);
                GetDotNetVersion(NDPKey.OpenSubKey(subkey).OpenSubKey("Full"), subkey, versions);
            }
        }
        return versions;
    }

    private static void GetDotNetVersion(RegistryKey parentKey, string subVersionName, Collection<Version> versions)
    {
        if (parentKey != null)
        {
            string installed = Convert.ToString(parentKey.GetValue("Install"));
            if (installed == "1")
            {
                string version = Convert.ToString(parentKey.GetValue("Version"));
                if (string.IsNullOrEmpty(version))
                {
                    if (subVersionName.StartsWith("v"))
                        version = subVersionName.Substring(1);
                    else
                        version = subVersionName;
                }

                Version ver = new Version(version);

                if (!versions.Contains(ver))
                    versions.Add(ver);
            }
        }
    }
}
espacio medio
fuente
1
Cambie Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP", true)a Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP")para evitar una excepción de seguridad en usuarios que no sean administradores.
Jon Cage
¡Genial, usé LinqPad y me dio resultados perfectos! share.linqpad.net/5cjihh.linq
user917170
¡Es extraño que comparta detalles pequeños (como qué versión de Service Pack está instalada) pero su código ignora la información más importante (si el marco está instalado solo parcial o completamente)! Es incorrecto tratar las claves de registro "Cliente" y "Completo" como si fueran lo mismo. Si solo la tecla "Cliente" sale, por ejemplo, System.Web no estará disponible. ¡Esta información importante también debe ser devuelta por su código! Si el usuario ha desinstalado ".NET Framework 4 Extended" en el Panel de control, faltarán varios ensamblajes.
Elmue
8

Quería detectar la presencia de .NET versión 4.5.2 instalada en mi sistema, y ​​no encontré una solución mejor que ASoft .NET Version Detector .

Instantánea de esta herramienta que muestra diferentes versiones de .NET:

Instantánea de esta herramienta que muestra diferentes versiones de .NET

Faisal Mq
fuente
7

Enumerar las subclaves de HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP. Cada subclave es una versión .NET . Debe tener un Install=1valor si está presente en la máquina, un valor de SP que muestra el paquete de servicio y un MSI=1valor si se instaló utilizando un MSI. (.NET 2.0 en Windows Vista no tiene el último, por ejemplo, ya que es parte del sistema operativo).

Franci Penov
fuente
No encontré esta clave en mi máquina (XP Pro), pero tenía esto: HKLM \ SOFTWARE \ Microsoft \ .NETFramework. Sin embargo, los diversos valores que describe no existen para mí.
Charlie
Debería tener esta clave si tiene instalado .NET 1.1 o posterior. La clave que mencionó solo se usó para .NET 1.0.
Scott Dorman
consulta de registro "HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ NET Framework Setup \ NDP"
entusiasmo el
5

Para un sistema operativo de 64 bits, la ruta sería:

HKEY_LOCAL_MACHINE\SOFTWARE\wow6432Node\Microsoft\NET Framework Setup\NDP\
abhishek mehta
fuente
10
Esto es solo "algo" cierto. El registro en las versiones de Windows de 64 bits se divide en claves de 32 bits y 64 bits (con muchas de las claves de 32 bits que tienen el mismo nombre que las claves de 64 bits). La Wow6432Nodeclave de registro es parte del reflector de registro WOW64, que refleja ciertas claves y valores entre las vistas de registro de 64 bits y 32 bits. No debería haber necesidad de acceder a esta clave directamente ya que el registro maneja automáticamente la redirección y la duplicación.
Scott Dorman
5

Actualización para .NET 4.5.1

Ahora que .NET 4.5.1 está disponible, debe verificarse el valor real de la clave denominada Release en el registro, no solo su existencia. Un valor de 378758 significa que .NET Framework 4.5.1 está instalado. Sin embargo, como se describe aquí, este valor es 378675 en Windows 8.1.

JasonMcF
fuente
5

Hay una herramienta GUI disponible, ASoft .NET Version Detector , que siempre ha demostrado ser altamente confiable. Puede crear archivos XML especificando el nombre del archivo de salida XML en la línea de comando.

Podrías usar esto para la automatización. Es un programa pequeño, escrito en un lenguaje no dependiente de .NET y no requiere instalación.

CarlR
fuente
4

Necesitaba averiguar qué versión de .NET Framework tenía en mi computadora, y todo lo que hice fue ir al panel de control y seleccionar la opción "Desinstalar un programa". Después de eso, ordené los programas por nombre y encontré Microsoft .NET Framework 4 Client Profile.

Kudzai K
fuente
1
Gracias. Todas las demás "soluciones" que probé tenían defectos y no funcionaban. Esto hizo
user20493
La razón por la que vine a buscar esta información fue que las cosas de Desinstalar un programa son totalmente poco confiables, al menos cuando se trata de .NET Framework.
tobbenb3
3

Aquí hay un script de PowerShell para obtener versiones instaladas de .NET Framework

function Get-KeyPropertyValue($key, $property)
{
    if($key.Property -contains $property)
    {
        Get-ItemProperty $key.PSPath -name $property | select -expand $property
    }
}

function Get-VersionName($key)
{
   $name = Get-KeyPropertyValue $key Version
   $sp = Get-KeyPropertyValue $key SP
   $install = Get-KeyPropertyValue $key Install
   if($sp)
   {
        "$($_.PSChildName) $name SP $sp"
   }
   else{
    "$($_.PSChildName) $name"
   }
}

function Get-FrameworkVersion{
   dir "hklm:\SOFTWARE\Microsoft\NET Framework Setup\NDP\" |? {$_.PSChildName -like "v*"} |%{
    if( $_.Property -contains "Version")
    {
        Get-VersionName $_
    }
    else{
        $parent = $_
        Get-ChildItem $_.PSPath |%{
            $versionName = Get-VersionName $_
            "$($parent.PSChildName) $versionName"
            }
        }
    }
}


$v4Directory = "hklm:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full"
if(Test-Path $v4Directory)
{
    $v4 = Get-Item $v4Directory
    $version = Get-KeyPropertyValue $v4 Release
    switch($version){
        378389 {".NET Framework 4.5"; break;}
        378675 {".NET Framework 4.5.1 installed with Windows 8.1 or Windows Server 2012 R2"; break;}
        378758 {".NET Framework 4.5.1 installed on Windows 8, Windows 7 SP1, or Windows Vista SP2"; break;}
        379893 {".NET Framework 4.5.2"; break;}
        { 393295, 393297 -contains $_} {".NET Framework 4.6"; break;}
        { 394254, 394271 -contains $_} {".NET Framework 4.6.1"; break;}
        { 394802, 394806 -contains $_} {".NET Framework 4.6.2"; break; }
    }
}

Fue escrito en base a Cómo: determinar qué versiones de .NET Framework están instaladas . Utilice la función THE Get-FrameworkVersion () para obtener información sobre las versiones instaladas de .NET Framework.

cezarypiatek
fuente
2

Usando la biblioteca Signum.Utilities de SignumFramework (que puede usar de forma independiente), puede obtenerla de manera agradable y sin tener que lidiar con el registro usted mismo:

AboutTools.FrameworkVersions().ToConsole();
//Writes in my machine:
//v2.0.50727 SP2
//v3.0 SP2
//v3.5 SP1
mapache
fuente
2
Mirando el código para este método, no está muy completo en cuanto a las claves de registro que usa y perderá completamente .NET 1.0 y no distingue entre .NET 2.0 (RTM) y .NET 2.0 SP1. Tampoco tiene en cuenta las dependencias entre versiones de framework.
Scott Dorman el
2
No es una buena solución. No hay una buena razón para descargar una biblioteca completa solo para obtener la versión .NET cuando puede hacer el mismo trabajo usted mismo en aproximadamente 3 líneas de código. Como programador, DEBERÍA poder "manejar el registro usted mismo".
TheSmurf
3
@DannySmurf No estoy de acuerdo. Cuando se introdujo .NET 3.0, MS debería haber envuelto esto en una API .NET (tan pronto como tuviéramos una capa de FX en el mismo CLR). Prefiero que mi aplicación use una biblioteca de utilidades, luego, cuando llegue 4.1, 6.1, 7.100, puedo actualizar la biblioteca y una entrada de configuración para qué capa de .NET requiere mi aplicación. Por supuesto, este argumento no aguanta si ninguna de las bibliotecas funciona.
yzorg
1

Consulte Cómo: determinar qué versiones de .NET Framework están instaladas (MSDN).

MSDN propone un ejemplo de función que parece hacer el trabajo para la versión 1-4. Según el artículo, el resultado del método es:

v2.0.50727  2.0.50727.4016  SP2
v3.0  3.0.30729.4037  SP2
v3.5  3.5.30729.01  SP1
v4
  Client  4.0.30319
  Full  4.0.30319

Tenga en cuenta que para "versiones 4.5 y posteriores" hay otra función.

Olivier de Rivoyre
fuente
1

En Windows 7 (también debería funcionar para Windows 8, pero no lo he probado):

Ir a un símbolo del sistema

Pasos para ir a un símbolo del sistema:

  1. Haga clic en el menú de inicio
  2. En el cuadro de búsqueda, escriba "cmd" (sin comillas)
  3. Abrir cmd.exe

En cmd, escriba este comando

wmic /namespace:\\root\cimv2 path win32_product where "name like '%%.NET%%'" get version

Esto proporciona la última versión de NET Framework instalada.

También se puede probar Raymond.cc Utilities para lo mismo.

Mayank Agarwal
fuente
1
Correr esa línea cmdme da ERROR: Description = Invalid namespace.
MEMark
También reciboERROR: Description = Invalid namespace
Peter
Este comando me da un error! (ejecutado desde la terminal de Windows 7)
Smrita
Gracias MEMark, Peter, Smrita por notificar.
Mayank Agarwal