Wie erkenne ich, welche .NET Framework-Versionen und Service Packs installiert sind?

289

Eine ähnliche Frage wurde hier gestellt , war jedoch spezifisch für .NET 3.5. Insbesondere suche ich Folgendes:

  1. Wie kann richtig ermittelt werden, welche .NET Framework-Versionen und Service Packs installiert sind?
  2. Gibt es eine Liste von Registrierungsschlüsseln, die verwendet werden können?
  3. Gibt es Abhängigkeiten zwischen Framework-Versionen?
Scott Dorman
quelle
2
Diese Frage steht in engem Zusammenhang mit stackoverflow.com/questions/198931/… und stackoverflow.com/questions/182910/…
Pascal Paradis
Ja, so ist es. Ich wusste bereits über den ersten Bescheid (auf den ich mich in meiner Frage beziehe). Ich wusste nichts über den anderen.
Scott Dorman
3
Ich bin beeindruckt, wie diese Frage (einschließlich Antworten) und alle eng verwandten Fragen das Vorhandensein der SKU-Werte völlig ignorieren - dies unterscheidet sogar zwischen 4.5 und 4.5.1.
springy76
@ springy76, Der Grund dafür, dass das Vorhandensein von SKU-Werten nicht berücksichtigt wird, liegt darin, dass sie für die Bestimmung der installierten Versionen des Frameworks nicht relevant sind. Die Frage, auf die Sie sich beziehen, versucht tatsächlich festzustellen, ob ".NET 4.0.2" installiert ist. Das Problem hierbei ist, dass es kein .NET 4.0.2 gab, es war ein Update (KB2544514), keine Framework-Version oder ein Service Pack. In diesem Artikel zu MSDN ( msdn.microsoft.com/en-us/library/hh925567(v=vs.110).aspx ) finden Sie weitere Informationen zum Erkennen der installierten Updates.
Scott Dorman
Hier haben Sie
überprüfen,

Antworten:

365

Die Registrierung ist die offizielle Methode, um festzustellen, ob eine bestimmte Version des Frameworks installiert ist.

Geben Sie hier die Bildbeschreibung ein

Welche Registrierungsschlüssel benötigt werden, hängt von der gesuchten Framework-Version ab:

Registrierungsschlüssel für die Framework-Version
-------------------------------------------------- ----------------------------------------
1.0 HKLM \ Software \ Microsoft \ .NETFramework \ Policy \ v1.0 \ 3705 
1.1 HKLM \ Software \ Microsoft \ NET Framework-Setup \ NDP \ v1.1.4322 \ Installieren 
2.0 HKLM \ Software \ Microsoft \ NET Framework-Setup \ NDP \ v2.0.50727 \ Installieren 
3.0 HKLM \ Software \ Microsoft \ NET Framework-Setup \ NDP \ v3.0 \ Setup \ InstallSuccess 
3.5 HKLM \ Software \ Microsoft \ NET Framework-Setup \ NDP \ v3.5 \ Installieren 
4.0 Client-Profil HKLM \ Software \ Microsoft \ NET Framework-Setup \ NDP \ v4 \ Client \ Install
4.0 Vollständiges Profil HKLM \ Software \ Microsoft \ NET Framework-Setup \ NDP \ v4 \ Vollständig \ Installieren

Generell suchen Sie:

"Install"=dword:00000001

mit Ausnahme von .NET 1.0, wo der Wert eine Zeichenfolge ( REG_SZ) und keine Zahl ( REG_DWORD) ist.

Die Bestimmung des Service Pack-Levels erfolgt nach einem ähnlichen Muster:

Registrierungsschlüssel für die Framework-Version
-------------------------------------------------- ----------------------------------------
1.0 HKLM \ Software \ Microsoft \ Active Setup \ Installierte Komponenten \ {78705f0d-e8db-4b2d-8193-982bdda15ecd} \ Version 
1.0 [1] HKLM \ Software \ Microsoft \ Active Setup \ Installierte Komponenten \ {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-Profil HKLM \ Software \ Microsoft \ NET Framework-Setup \ NDP \ v4 \ Client \ Servicing
4.0 Vollständiges Profil HKLM \ Software \ Microsoft \ NET Framework-Setup \ NDP \ v4 \ Vollständig \ Wartung

[1] Windows Media Center oder Windows XP Tablet Edition

Wie Sie sehen können, ändert sich das Bestimmen der SP-Stufe für .NET 1.0, wenn Sie unter Windows Media Center oder Windows XP Tablet Edition ausgeführt werden. Auch hier verwendet .NET 1.0 einen Zeichenfolgenwert, während alle anderen ein DWORD verwenden.

Für .NET 1.0 hat der Zeichenfolgenwert an einem dieser Schlüssel das Format #, #, ####, #. Das letzte # ist das Service Pack-Level.

Obwohl ich nicht explizit danach gefragt habe, würden Sie diese Registrierungsschlüssel verwenden, wenn Sie die genaue Versionsnummer des Frameworks wissen möchten:

Registrierungsschlüssel für die Framework-Version
-------------------------------------------------- ----------------------------------------
1.0 HKLM \ Software \ Microsoft \ Active Setup \ Installierte Komponenten \ {78705f0d-e8db-4b2d-8193-982bdda15ecd} \ Version 
1.0 [1] HKLM \ Software \ Microsoft \ Active Setup \ Installierte Komponenten \ {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-Profil HKLM \ Software \ Microsoft \ NET Framework-Setup \ NDP \ v4 \ Version 
4.0 Vollständiges Profil HKLM \ Software \ Microsoft \ NET Framework-Setup \ NDP \ v4 \ Version 

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

Auch hier verwendet .NET 1.0 einen Zeichenfolgenwert, während alle anderen ein DWORD verwenden.

Zusätzliche Bemerkungen

  • Für .NET 1.0 hat der Zeichenfolgenwert an einem dieser Schlüssel das Format #,#,####,#. Der #,#,####Teil der Zeichenfolge ist die Framework-Version.

  • Für .NET 1.1 verwenden wir den Namen des Registrierungsschlüssels selbst, der die Versionsnummer darstellt.

  • Wenn Sie sich die Abhängigkeiten ansehen, fügt .NET 3.0 .NET 2.0 zusätzliche Funktionen hinzu, sodass sowohl .NET 2.0 als auch .NET 3.0 als installiert ausgewertet werden müssen, um korrekt zu sagen, dass .NET 3.0 installiert ist. Ebenso fügt .NET 3.5 .NET 2.0 und .NET 3.0 zusätzliche Funktionen hinzu. Daher sollten .NET 2.0, .NET 3.0 und .NET 3. als installiert bewertet werden, um korrekt zu sagen, dass .NET 3.5 installiert ist.

  • .NET 4.0 installiert eine neue Version der CLR (CLR-Version 4.0), die neben CLR 2.0 ausgeführt werden kann.

Update für .NET 4.5

v4.5Wenn .NET 4.5 installiert ist, ist kein Schlüssel in der Registrierung vorhanden. Stattdessen müssen Sie überprüfen, ob der HKLM\Software\Microsoft\NET Framework Setup\NDP\v4\FullSchlüssel einen aufgerufenen Wert enthält Release. Wenn dieser Wert vorhanden ist, wird .NET 4.5 installiert, andernfalls nicht. Weitere Details finden Sie hier und hier .

Scott Dorman
quelle
1
Dies scheint für .NET 1.1 unter Vista x64 nicht zu funktionieren. An keiner der möglichen Stellen befinden sich v1.1.x-Schlüssel. Ideen?
Chris Hynes
7
Die Schlüssel für .NET 4.0 sind nicht ganz korrekt. Ich sehe diese Schlüssel: HKLM \ Software \ Microsoft \ NET Framework-Setup \ NDP \ v4 \ Client \ Installieren HKLM \ Software \ Microsoft \ NET Framework-Setup \ NDP \ v4 \ Vollständig \ Installieren Der Ordner v4.0 enthält nur einen Schlüssel , (Standard) mit dem Wert veraltet.
RandomEngy
2
Dieser Beitrag behandelt nicht 4.5 und 4.5 ist nicht in der Registrierung aufgeführt, obwohl es installiert ist.
Klas Mellbourn
37
Mann, hat niemand bei Microsoft daran gedacht, einen -version-Schalter hinzuzufügen?
Gnuchu
2
Es ist ein Witz. Ich kann nicht glauben, dass es sooooo dumm ist!
Alex Byrth
17

Eine offizielle Antwort von Microsoft auf diese Frage finden Sie im folgenden Knowledge Base-Artikel:

Artikel-ID: 318785 - Letzte Überprüfung: 7. November 2008 - Revision: 20.1 So ermitteln Sie, welche Versionen von .NET Framework installiert sind und ob Service Packs angewendet wurden

Leider scheint es nicht zu funktionieren, da die mscorlib.dll-Version im 2.0-Verzeichnis eine 2.0-Version hat und es weder in den 3.0- noch in den 3.5-Verzeichnissen eine mscorlib.dll-Version gibt, obwohl 3.5 SP1 installiert ist ... warum Wäre die offizielle Microsoft-Antwort so falsch informiert?

anon
quelle
2
+1 - Möglicherweise hat Microsoft diese Seite aktualisiert, seit Sie sie ursprünglich verlinkt haben. Es sieht also so aus, als wäre dies eine der besten offiziellen Quellen in dieser Angelegenheit.
Jpierson
2
Es geht nur bis 4.0
user316117
16

Die Betaversion von Framework 4 wird auf einem anderen Registrierungsschlüssel installiert.

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);
            }
        }
    }
}
Mittelraum
quelle
1
Wechseln Sie Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP", true)zu Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP"), um eine Sicherheitsausnahme für Benutzer ohne Administratorrechte zu vermeiden.
Jon Cage
Cool, ich habe LinqPad verwendet und es hat mir perfekte Ergebnisse gebracht! share.linqpad.net/5cjihh.linq
user917170
Es ist seltsam, dass Sie kleine Details mitteilen (z. B. welche Service Pack-Version installiert ist), aber die wichtigeren Informationen (wenn das Framework nur teilweise oder vollständig installiert ist) werden von Ihrem Code ignoriert !! Es ist falsch, die Registrierungsschlüssel "Client" und "Voll" so zu behandeln, als wären sie gleich. Wenn nur der Schlüssel "Client" beendet wird, ist beispielsweise System.Web nicht verfügbar. Diese wichtigen Informationen sollten auch von Ihrem Code zurückgegeben werden! Wenn der Benutzer ".NET Framework 4 Extended" in der Systemsteuerung deinstalliert hat, fehlen mehrere Assemblys.
Elmue
8

Ich wollte feststellen, ob auf meinem System .NET Version 4.5.2 installiert ist, und fand keine bessere Lösung als ASoft .NET Version Detector .

Schnappschuss dieses Tools mit verschiedenen .NET-Versionen:

Schnappschuss dieses Tools mit verschiedenen .NET-Versionen

Faisal Mq
quelle
7

Zählen Sie die Unterschlüssel von auf HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP. Jeder Unterschlüssel ist eine .NET- Version. Es sollte einen Install=1Wert haben , wenn es auf dem Computer vorhanden ist, einen SP-Wert, der das Service Pack anzeigt, und einen MSI=1Wert, wenn es mit einer MSI installiert wurde. (.NET 2.0 unter Windows Vista verfügt beispielsweise nicht über das letzte, da es Teil des Betriebssystems ist.)

Franci Penov
quelle
Ich habe diesen Schlüssel auf meinem Computer (XP Pro) nicht gefunden, aber ich hatte diesen: HKLM \ SOFTWARE \ Microsoft \ .NETFramework. Die verschiedenen Werte, die Sie beschreiben, existieren für mich jedoch nicht.
Charlie
Sie sollten diesen Schlüssel haben, wenn Sie .NET 1.1 oder höher installiert haben. Der von Ihnen erwähnte Schlüssel wurde nur für .NET 1.0 verwendet.
Scott Dorman
reg Abfrage "HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ NET Framework Setup \ NDP"
Enthusiasten
5

Für ein 64-Bit-Betriebssystem wäre der Pfad:

HKEY_LOCAL_MACHINE\SOFTWARE\wow6432Node\Microsoft\NET Framework Setup\NDP\
abhishek mehta
quelle
10
Dies ist nur "etwas" wahr. Die Registrierung in 64-Bit-Versionen von Windows ist in 32-Bit- und 64-Bit-Schlüssel unterteilt (wobei viele der 32-Bit-Schlüssel denselben Namen wie die 64-Bit-Schlüssel haben). Der Wow6432NodeRegistrierungsschlüssel ist Teil des WOW64-Registrierungsreflektors, der bestimmte Schlüssel und Werte zwischen der 64-Bit- und der 32-Bit-Registrierungsansicht widerspiegelt. Es sollte nicht erforderlich sein, direkt auf diesen Schlüssel zuzugreifen, da die Registrierung die Umleitung und Spiegelung automatisch übernimmt.
Scott Dorman
5

Update für .NET 4.5.1

Nachdem .NET 4.5.1 verfügbar ist, muss der tatsächliche Wert des Schlüssels mit dem Namen Release in der Registrierung überprüft werden, nicht nur seine Existenz. Ein Wert von 378758 bedeutet, dass .NET Framework 4.5.1 installiert ist. Wie hier beschrieben, ist dieser Wert unter Windows 8.1 jedoch 378675.

JasonMcF
quelle
5

Es gibt ein GUI-Tool, ASoft .NET Version Detector , das sich immer als äußerst zuverlässig erwiesen hat. Es kann XML-Dateien erstellen, indem der Dateiname der XML-Ausgabe in der Befehlszeile angegeben wird.

Sie können dies für die Automatisierung verwenden. Es ist ein winziges Programm, das in einer nicht von NET abhängigen Sprache geschrieben ist und keine Installation erfordert.

CarlR
quelle
4

Ich musste herausfinden, welche Version von .NET Framework ich auf meinem Computer hatte, und alles, was ich tat, war, in die Systemsteuerung zu gehen und die Option "Programm deinstallieren" auszuwählen. Danach sortierte ich die Programme nach Namen und fand Microsoft .NET Framework 4 Client Profile.

Kudzai K.
quelle
1
Danke - Jede andere "Lösung", die ich ausprobiert habe, war fehlerhaft und würde nicht funktionieren. Das hat es getan.
user20493
Der Grund, warum ich nach diesen Informationen gesucht habe, war, dass die Inhalte unter Programm deinstallieren völlig unzuverlässig sind, zumindest wenn es um .NET Framework geht.
Tobbenb3
3

Hier ist ein PowerShell-Skript zum Abrufen installierter .NET Framework-Versionen

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

Es wurde basierend auf folgenden Methoden geschrieben: Bestimmen, welche .NET Framework-Versionen installiert werden . Verwenden Sie die Funktion Get-FrameworkVersion (), um Informationen zu installierten .NET Framework-Versionen abzurufen.

Cezarypiatek
quelle
2

Mit der Signum.Utilities- Bibliothek von SignumFramework (die Sie eigenständig verwenden können) können Sie sie gut und ohne sich selbst mit der Registrierung befassen:

AboutTools.FrameworkVersions().ToConsole();
//Writes in my machine:
//v2.0.50727 SP2
//v3.0 SP2
//v3.5 SP1
Mapache
quelle
2
Wenn man sich den Code für diese Methode ansieht, ist er hinsichtlich der verwendeten Registrierungsschlüssel nicht sehr vollständig und wird .NET 1.0 vollständig vermissen und unterscheidet nicht zwischen .NET 2.0 (RTM) und .NET 2.0 SP1. Außerdem werden die Abhängigkeiten zwischen Framework-Versionen nicht berücksichtigt.
Scott Dorman
2
Keine gute Lösung. Es gibt keinen guten Grund, eine ganze Bibliothek herunterzuladen, nur um die .NET-Version zu erhalten, wenn Sie die gleiche Arbeit in etwa 3 Codezeilen selbst ausführen können. Als Programmierer sollten Sie in der Lage sein, "sich selbst um die Registrierung zu kümmern".
TheSmurf
3
@DannySmurf Ich stimme nicht zu. Als .NET 3.0 eingeführt wurde, hätte MS dies in eine .NET-API einbinden sollen (sobald wir mehr als eine FX-Schicht auf derselben CLR hatten). Ich möchte lieber, dass meine Anwendung eine Dienstprogrammbibliothek verwendet. Wenn dann 4.1, 6.1, 7.100 eintrifft, kann ich einfach die Bibliothek und einen Konfigurationseintrag aktualisieren, für welche .NET-Schicht meine App benötigt. Natürlich enthält dieses Argument kein Wasser, wenn keine der Bibliotheken funktioniert.
Yzorg
1

Siehe Gewusst wie: Bestimmen, welche .NET Framework-Versionen installiert sind (MSDN).

MSDN schlägt ein Funktionsbeispiel vor, das die Aufgabe für Version 1-4 zu erfüllen scheint. Laut Artikel lautet die Methodenausgabe:

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

Beachten Sie, dass es für "Versionen 4.5 und höher" eine andere Funktion gibt.

Olivier de Rivoyre
quelle
1

In Windows 7 (es sollte auch für Windows 8 funktionieren, aber ich habe es nicht getestet):

Gehen Sie zu einer Eingabeaufforderung

Schritte zum Aufrufen einer Eingabeaufforderung:

  1. Klicken Sie auf Startmenü
  2. Geben Sie im Suchfeld "cmd" ein (ohne Anführungszeichen)
  3. Öffnen Sie cmd.exe

Geben Sie in cmd diesen Befehl ein

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

Dadurch wird die neueste Version von NET Framework installiert.

Man kann auch Raymond.cc Utilties für das gleiche versuchen .

Mayank Agarwal
quelle
1
Wenn cmdich diese Zeile einführe, bekomme ich ERROR: Description = Invalid namespace.
MEMark
Ich bekomme auchERROR: Description = Invalid namespace
Peter
Dieser Befehl gibt mir Fehler! (ausgeführt von Windows 7 Terminal)
Smrita
Vielen Dank MEMark, Peter, Smrita für die Benachrichtigung.
Mayank Agarwal