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


Eine ähnliche Frage wurde hier gestellt , aber spezifisch für .NET 3.5. Insbesondere suche ich folgendes:

  1. Was ist der richtige Weg, um festzustellen, 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?



Answers


Die Registrierung ist der offizielle Weg, um festzustellen, ob eine bestimmte Version des Frameworks installiert ist.

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

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

Generell suchen Sie:

"Install"=dword:00000001

außer .NET 1.0, wobei der Wert eine Zeichenfolge ( REG_SZ ) und keine Nummer ( REG_DWORD ) ist.

Das Ermitteln der Service Pack-Ebene folgt einem ähnlichen Muster:

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

Wie Sie sehen, wird die SP-Stufe für .NET 1.0 geändert, wenn Sie auf 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 eines dieser Schlüssel das Format #, #, ####, #. Die letzte # ist der Service Pack-Level.

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

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)

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 eines dieser Schlüssel das Format #,#,####,# . Der #,#,#### Teil der Zeichenkette ist die Framework Version.

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

  • Wenn Sie sich Abhängigkeiten ansehen, fügt .NET 3.0 zusätzliche Funktionen zu .NET 2.0 hinzu, also müssen sowohl .NET 2.0 als auch .NET 3.0 als installiert gelten, um korrekt zu sagen, dass .NET 3.0 installiert ist. Ebenso fügt .NET 3.5 zusätzliche Funktionalität zu .NET 2.0 und .NET 3.0 hinzu, daher sollten .NET 2.0, .NET 3.0 und .NET 3. alle als installierbar bewerten, um korrekt zu sagen, dass .NET 3.5 installiert ist.

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

Update für .NET 4.5

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




Es gibt eine offizielle Microsoft-Antwort zu dieser Frage in dem folgenden Knowledge Base-Artikel:

Artikel-ID: 318785 - Last Review: 7. November 2008 - Version: 20.1 So ermitteln Sie, welche Versionen von .NET Framework installiert sind und ob Service Packs installiert wurden

Leider scheint es nicht zu funktionieren, da die mscorlib.dll-Version im 2.0-Verzeichnis eine 2.0-Version hat und es keine mscorlib.dll-Version in den Verzeichnissen 3.0 oder 3.5 gibt, obwohl 3.5 SP1 installiert ist ... warum würde die offizielle Microsoft-Antwort so falsch informiert werden?




Die Framework 4-Betaversion wird in 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);
            }
        }
    }
}



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




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

Snapshot dieses Tools zeigt verschiedene .NET-Versionen:







Bei einem 64-Bit-Betriebssystem wäre der Pfad wie folgt:

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



Update für .NET 4.5.1

Jetzt, da .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 dessen Existenz. Ein Wert von 378758 bedeutet, dass .NET Framework 4.5.1 installiert ist. Wie hier beschrieben, ist dieser Wert jedoch 378675 unter Windows 8.1.




Es gibt ein GUI-Tool, den ASoft .NET Version Detector , der sich seit jeher als sehr zuverlässig erwiesen hat. Es kann XML-Dateien erstellen, indem es den Dateinamen der XML-Ausgabe in der Befehlszeile angibt.

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




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




Hier finden Sie ein PowerShell-Skript, um installierte .NET Framework-Versionen zu erhalten

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 geschrieben basierend auf Gewusst wie: Ermitteln, welche .NET Framework-Versionen installiert sind . Verwenden Sie die Funktion Get-FrameworkVersion (), um Informationen über installierte .NET Framework-Versionen zu erhalten.




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

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












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

Gehe zu einer Eingabeaufforderung

Schritte zum Abrufen einer Eingabeaufforderung:

  1. Klicken Sie auf Startmenü
  2. Geben Sie im Suchfeld "cmd" (ohne Anführungszeichen) ein.
  3. Öffne 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 Raymond.cc Utilties auch gleich ausprobieren.




Siehe Gewusst wie: Ermitteln, 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 dem 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 später" eine andere Funktion gibt.