Come posso rilevare quali versioni di .NET Framework e service pack sono installati?


289

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

  1. Qual è il modo corretto per determinare quali versioni di .NET Framework e service pack sono installati?
  2. Esiste un elenco di chiavi di registro che possono essere utilizzate?
  3. Esistono dipendenze tra le versioni di Framework?


Sì. Conoscevo già il primo (è quello a cui mi riferisco nella mia domanda). Non sapevo dell'altro.
Scott Dorman,

3
Sono impressionato dal modo in cui questa domanda (comprese le risposte) e tutte le domande strettamente correlate ignorano del tutto la presenza dei valori SKU - ciò differenzia persino tra 4.5 e 4.5.1.
Spring76,

@ springy76, Il motivo per cui questo non affronta la presenza di valori SKU è perché, al fine di determinare quali versioni del Framework sono installate, non sono rilevanti. La domanda a cui ti riferisci sta effettivamente provando a determinare se ".NET 4.0.2" è installato. Il problema qui è che non esisteva .NET 4.0.2, era un aggiornamento (KB2544514), non una versione di Framework o un service pack. Puoi leggere questo articolo su MSDN ( msdn.microsoft.com/en-us/library/hh925567(v=vs.110).aspx ) per ulteriori informazioni su come rilevare quali aggiornamenti sono installati.
Scott Dorman,

Risposte:


365

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

inserisci qui la descrizione dell'immagine

Quali chiavi di registro sono necessarie cambiano a seconda della versione di Framework che stai cercando:

Chiave di registro versione framework
-------------------------------------------------- ----------------------------------------
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 Profilo client HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Client \ Installa
4.0 HKLM \ Software \ Microsoft \ NET Framework Setup \ Profile \ NDP \ v4 \ Full \ Install completo

In generale stai cercando:

"Install"=dword:00000001

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

La determinazione del livello del service pack segue un modello simile:

Chiave di registro versione framework
-------------------------------------------------- ----------------------------------------
1.0 HKLM \ Software \ Microsoft \ Installazione attiva \ Componenti installati \ {78705f0d-e8db-4b2d-8193-982bdda15ecd} \ Versione 
1.0 [1] HKLM \ Software \ Microsoft \ Active Setup \ Componenti installati \ {FDC11A6F-17D1-48f9-9EA3-9051954BAA24} \ Versione 
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 Profilo client HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Client \ Manutenzione
4.0 HKLM \ Software \ Microsoft \ NET Framework Setup \ Profile \ NDP \ v4 \ Full \ Service completo

[1] Windows Media Center o Windows XP Tablet Edition

Come puoi vedere, determinare il livello SP per .NET 1.0 cambia se sei in esecuzione su Windows Media Center o Windows XP Tablet Edition. Ancora una volta, .NET 1.0 utilizza un valore di stringa mentre tutti gli altri utilizzano un DWORD.

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

Anche se non ho chiesto esplicitamente questo, se si desidera conoscere il numero esatto di versione del Framework, si utilizzerebbero queste chiavi di registro:

Chiave di registro versione framework
-------------------------------------------------- ----------------------------------------
1.0 HKLM \ Software \ Microsoft \ Installazione attiva \ Componenti installati \ {78705f0d-e8db-4b2d-8193-982bdda15ecd} \ Versione 
1.0 [1] HKLM \ Software \ Microsoft \ Active Setup \ Componenti installati \ {FDC11A6F-17D1-48f9-9EA3-9051954BAA24} \ Versione 
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 Profilo client HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Versione 
4.0 Profilo completo HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Versione 

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

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

Note aggiuntive

  • per .NET 1.0 il valore di stringa in 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 considerano le dipendenze, .NET 3.0 aggiunge funzionalità aggiuntive a .NET 2.0, pertanto sia .NET 2.0 che .NET 3.0 devono essere entrambi evacuati come installati per dire correttamente che .NET 3.0 è installato. Allo stesso modo, .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 tutti valutare di essere installati per dire correttamente che .NET 3.5 è installato.

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

Aggiornamento per .NET 4.5

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


1
Questo non sembra funzionare per .NET 1.1 in Vista x64. Nessuna chiave v1.1.x si trova in nessuna delle posizioni possibili. Idee?
Chris Hynes,

7
Le chiavi per .NET 4.0 non sono del tutto corrette. Visualizzo queste chiavi: HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Client \ Install HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Full \ Install La cartella v4.0 ha solo una chiave , (Impostazione predefinita) con un valore obsoleto.
RandomEngy

2
Questo post non copre 4.5 e 4.5 non è elencato nel registro anche se è installato.
Klas Mellbourn,

37
Amico, nessuno in Microsoft ha pensato di aggiungere un interruttore -version?
Gnuchu,

2
È uno scherzo. Non riesco a credere che sia così stupido!
Alex Byrth,

17

Esiste una risposta ufficiale di Microsoft a questa domanda nel seguente articolo della knowledge base:

ID 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 esiste alcuna versione mscorlib.dll nelle directory 3.0 o 3.5 anche se è installato 3.5 SP1 ... perché la risposta ufficiale di Microsoft sarebbe così male informata?


2
+1: sembra che Microsoft abbia aggiornato quella pagina da quando è stata originariamente collegata ad essa. Quindi sembra che potrebbe essere una delle migliori fonti ufficiali in materia.
jpierson,

2
Va solo fino a 4.0
user316117

16

Il Framework 4 beta 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);
            }
        }
    }
}

1
Passare Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP", true)a Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP")per evitare un'eccezione di sicurezza per gli utenti non amministratori.
Jon Cage,

Bene, ho usato LinqPad e mi ha dato risultati perfetti! share.linqpad.net/5cjihh.linq
user917170

È strano che condividi piccoli dettagli (come quale versione del service pack è installata) ma le informazioni più importanti (se il framework è installato solo parzialmente o completamente) sono ignorate dal tuo codice !! È errato trattare le chiavi di registro "Client" e "Full" come se fossero le stesse. Se solo la chiave "Client" esce, ad esempio System.Web non sarà disponibile. Queste informazioni importanti dovrebbero essere restituite anche dal tuo codice! Se l'utente ha disinstallato ".NET Framework 4 Extended" nel Pannello di controllo, mancheranno diversi assembly.
Elmue,

8

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

Istantanea di questo strumento che mostra diverse versioni .NET:

Istantanea di questo strumento che mostra diverse versioni .NET


7

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


Non ho trovato questa chiave sul mio computer (XP Pro), ma avevo questo: HKLM \ SOFTWARE \ Microsoft \ .NETFramework. Tuttavia, i vari valori che descrivi non esistono per me.
Charlie,

Dovresti avere questa chiave se hai installato .NET 1.1 o successivo. La chiave menzionata è stata utilizzata solo per .NET 1.0.
Scott Dorman,

query reg "HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ NET Framework Setup \ NDP"
entusiasmo

5

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

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

10
Questo è solo "in qualche modo" vero. Il registro nelle versioni a 64 bit di Windows è diviso in chiavi a 32 e 64 bit (con molte delle chiavi a 32 bit che hanno lo stesso nome delle chiavi a 64 bit). La Wow6432Nodechiave del Registro di sistema fa parte del riflettore del registro WOW64, che rispecchia determinate chiavi e valori tra le viste del registro a 64 e 32 bit. Non dovrebbe essere necessario accedere direttamente a questa chiave poiché il registro gestisce automaticamente il reindirizzamento e il mirroring.
Scott Dorman,

5

Aggiornamento per .NET 4.5.1

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


5

È 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.

Puoi usarlo per l'automazione. È un piccolo programma, scritto in un linguaggio non -.NET dipendente e non richiede installazione.


4

Avevo bisogno di scoprire quale versione di .NET framework avevo sul mio computer e tutto ciò che facevo era andare sul 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.


1
Grazie - Ogni altra "soluzione" che ho provato era imperfetta e non funzionava. Questo ha fatto.
user20493,

Il motivo per cui sono venuto alla ricerca di queste informazioni è che le cose in Uninstall a Program sono totalmente inaffidabili, almeno quando si tratta di .NET Framework.
tobbenb3

3

Ecco uno script di PowerShell per ottenere le versioni di .NET framework 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: Determinare quali versioni di .NET Framework sono installate . Utilizzare la funzione Get-FrameworkVersion () per ottenere informazioni sulle versioni di .NET framework installate.


2

Utilizzando la libreria Signum.Utilities di SignumFramework (che puoi utilizzare autonomamente), puoi ottenerlo in modo piacevole e senza occuparti del registro da solo:

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

2
Guardando il codice per questo metodo, non è molto completo per quanto riguarda le chiavi di registro che utilizza e mancherà completamente .NET 1.0 e non distingue tra .NET 2.0 (RTM) e .NET 2.0 SP1. Inoltre, non tiene conto delle dipendenze tra le versioni del framework.
Scott Dorman,

2
Non è una buona soluzione. Non c'è motivo per scaricare un'intera libreria solo per ottenere la versione .NET quando puoi fare lo stesso lavoro da solo in circa 3 righe di codice. Come programmatore, DOVREBBE essere in grado di "gestire autonomamente il registro".
TheSmurf,

3
@DannySmurf Non sono d'accordo. Quando .NET 3.0 fu introdotto, MS avrebbe dovuto racchiuderlo in un'API .NET (non appena avessimo più di un livello di FX sullo stesso CLR). Preferirei che la mia applicazione utilizzasse una libreria di utilità, quindi quando arrivano 4.1, 6.1, 7.100, posso semplicemente aggiornare la libreria e una voce di configurazione per quale livello di .NET richiede la mia app. Naturalmente questo argomento non regge, se nessuna delle biblioteche funziona.
yzorg,


1

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

Vai a un prompt dei comandi

I passaggi 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

Ciò fornisce l'ultima versione di NET Framework installata.

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


1
Eseguendo quella linea cmd mi dà ERROR: Description = Invalid namespace.
MEM

ottengo ancheERROR: Description = Invalid namespace
Peter,

Questo comando mi dà un errore! (eseguito dal terminale di Windows 7)
Smrita,

Grazie MEMark, Peter, Smrita per aver avvisato.
Mayank Agarwal,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.