Come faccio a sapere quali versioni di .NET Framework e service pack sono installati?


Una domanda simile è stata posta qui , ma era specifica per .NET 3.5. In particolare, sto cercando il seguente:

  1. Qual è il modo corretto per determinare quali versioni di .NET Framework e service pack sono installati?
  2. Esiste un elenco di chiavi del Registro di sistema che è possibile utilizzare?
  3. Ci sono delle dipendenze tra le versioni del Framework?


Answers


Il registro è il modo ufficiale per rilevare se è installata una versione specifica del Framework.

Quali chiavi del Registro di sistema sono necessarie cambiano a seconda della versione del Framework che si sta cercando:

Framework Version  Registry Key
------------------------------------------------------------------------------------------
1.0                HKLM\Software\Microsoft\.NETFramework\Policy\v1.0\3705 
1.1                HKLM\Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\Install 
2.0                HKLM\Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\Install 
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 Client Profile 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 stai cercando:

"Install"=dword:00000001

tranne .NET 1.0, dove il valore è una stringa ( REG_SZ ) anziché un numero ( REG_DWORD ).

La determinazione del livello del service pack segue uno schema simile:

Framework Version  Registry Key
------------------------------------------------------------------------------------------
1.0                HKLM\Software\Microsoft\Active Setup\Installed Components\{78705f0d-e8db-4b2d-8193-982bdda15ecd}\Version 
1.0[1]             HKLM\Software\Microsoft\Active Setup\Installed Components\{FDC11A6F-17D1-48f9-9EA3-9051954BAA24}\Version 
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 Client Profile HKLM\Software\Microsoft\NET Framework Setup\NDP\v4\Client\Servicing
4.0 Full Profile   HKLM\Software\Microsoft\NET Framework Setup\NDP\v4\Full\Servicing

[1] Windows Media Center or Windows XP Tablet Edition

Come si può vedere, determinare il livello SP per .NET 1.0 cambia se si esegue su Windows Media Center o Windows XP Tablet Edition. Ancora una volta, .NET 1.0 usa un valore di stringa mentre tutti gli altri usano un DWORD.

Per .NET 1.0 il valore di stringa in corrispondenza di una di queste chiavi ha un formato di #, #, ####, #. L'ultimo # è il livello di Service Pack.

Anche se non l'ho chiesto esplicitamente, se vuoi conoscere il numero esatto della versione del Framework userai queste chiavi di registro:

Framework Version  Registry Key
------------------------------------------------------------------------------------------
1.0                HKLM\Software\Microsoft\Active Setup\Installed Components\{78705f0d-e8db-4b2d-8193-982bdda15ecd}\Version 
1.0[1]             HKLM\Software\Microsoft\Active Setup\Installed Components\{FDC11A6F-17D1-48f9-9EA3-9051954BAA24}\Version 
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\Version 
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 Client Profile HKLM\Software\Microsoft\NET Framework Setup\NDP\v4\Version 
4.0 Full Profile   HKLM\Software\Microsoft\NET Framework Setup\NDP\v4\Version 

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

Ancora una volta, .NET 1.0 usa un valore di stringa mentre tutti gli altri usano un DWORD.

Note aggiuntive

  • per .NET 1.0 il valore di stringa in corrispondenza di una di queste chiavi ha un formato di #,#,####,# . La parte #,#,#### della stringa è la versione Framework.

  • per .NET 1.1, utilizziamo il nome della chiave di registro stessa, che rappresenta il numero di versione.

  • Infine, se si esaminano le dipendenze, .NET 3.0 aggiunge funzionalità aggiuntive a .NET 2.0, pertanto sia .NET 2.0 che .NET 3.0 devono entrambi essere installati per poter correttamente dire che .NET 3.0 è installato. Analogamente, .NET 3.5 aggiunge funzionalità aggiuntive a .NET 2.0 e .NET 3.0, quindi .NET 2.0, .NET 3.0 e .NET 3. dovrebbero essere tutti valutati per essere installati correttamente per dire che .NET 3.5 è installato.

  • .NET 4.0 installa una nuova versione di CLR (CLR versione 4.0) che può essere eseguita parallelamente a CLR 2.0.

Aggiornamento per .NET 4.5

Non ci sarà una chiave v4.5 nel registro se è installato .NET 4.5. Invece è necessario controllare se la chiave HKLM\Software\Microsoft\NET Framework Setup\NDP\v4\Full contiene un valore chiamato Release . Se questo valore è presente, .NET 4.5 è installato, altrimenti non lo è. Maggiori dettagli possono essere trovati qui e qui .




C'è una risposta Microsoft ufficiale a questa domanda al seguente articolo della Knowledge Base:

Identificativo articolo: 318785 - Ultima revisione: 7 novembre 2008 - Revisione: 20.1 Come determinare quali versioni di .NET Framework sono installate e se i service pack sono stati applicati

Sfortunatamente, non sembra funzionare, perché la versione mscorlib.dll nella directory 2.0 ha una versione 2.0 e non c'è la versione mscorlib.dll nelle directory 3.0 o 3.5 anche se è installato 3.5 SP1 ... perché la risposta ufficiale di Microsoft sarebbe stata così disinformata?




La versione beta di Framework 4 si installa su una chiave di registro diversa.

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);
            }
        }
    }
}



Enumerare le sottochiavi di HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP . Ogni sottochiave è una versione .NET . Dovrebbe avere valore Install=1 se è presente sulla macchina, un valore SP che mostra il service pack e un valore MSI=1 se è stato installato utilizzando un MSI. (.NET 2.0 su Windows Vista non ha l'ultimo, ad esempio, poiché fa parte del sistema operativo.)




Volevo rilevare la presenza di .NET versione 4.5.2 installata sul mio sistema e non ho trovato soluzione migliore di ASoft .NET Version Detector .

Istantanea di questo strumento che mostra diverse versioni .NET:







Per un sistema operativo a 64 bit, il percorso sarebbe:

HKEY_LOCAL_MACHINE\SOFTWARE\wow6432Node\Microsoft\NET Framework Setup\NDP\



Aggiornamento per .NET 4.5.1

Ora che .NET 4.5.1 è disponibile, è necessario verificare il valore effettivo della chiave denominata Release nel registro, non solo la sua esistenza. Un valore di 378758 indica che .NET Framework 4.5.1 è installato. Tuttavia, come descritto qui questo valore è 378675 su Windows 8.1.




È disponibile uno strumento GUI, ASoft .NET Version Detector , che si è sempre dimostrato altamente affidabile. Può creare file XML specificando il nome del file dell'output XML sulla riga di comando.

Potresti usarlo per l'automazione. È un programma minuscolo, scritto in un linguaggio non dipendente da .NET e non richiede installazione.




Avevo bisogno di scoprire solo quale versione di .NET framework avevo sul mio computer, e tutto ciò che ho fatto è stato andare al pannello di controllo e selezionare l'opzione "Disinstalla un programma". Successivamente, ho ordinato i programmi per nome e ho trovato il profilo client di Microsoft .NET Framework 4.




Ecco uno script PowerShell per ottenere le versioni di framework .NET installate

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; }
    }
}

È stato scritto in base a Come: Determinare quali versioni di .NET Framework sono installate . Utilizzare la funzione Get-FrameworkVersion () per ottenere informazioni sulle versioni del framework .NET installate.




Usando la libreria Signum.Utilities di SignumFramework (che puoi usare stand-alone), puoi ottenerla facilmente e senza occuparti del registro da solo:

AboutTools.FrameworkVersions().ToConsole();
//Writes in my machine:
//v2.0.50727 SP2
//v3.0 SP2
//v3.5 SP1












In Windows 7 (dovrebbe funzionare anche per Windows 8, ma non l'ho testato):

Vai a un prompt dei comandi

Passi per andare a un prompt dei comandi:

  1. Fai clic sul menu Start
  2. Nella casella di ricerca, digita "cmd" (senza virgolette)
  3. Apri cmd.exe

In cmd, digitare questo comando

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

Questo fornisce l'ultima versione di NET Framework installata.

Si può anche provare Raymond.cc Utilties per lo stesso.




Vedere Procedura: stabilire quali versioni di .NET Framework sono installate (MSDN).

MSDN propone un esempio di funzione che sembra eseguire il lavoro per la versione 1-4. Secondo l'articolo, l'output del metodo è:

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

Si noti che per "versioni 4.5 e successive" esiste un'altra funzione.