Comment puis-je détecter les versions et les Service Packs .NET Framework installés?


Une question similaire a été posée ici , mais elle était spécifique à .NET 3.5. Plus précisément, je cherche ce qui suit:

  1. Quelle est la méthode correcte pour déterminer quelles versions .NET Framework et service packs sont installés?
  2. Y a-t-il une liste de clés de registre pouvant être utilisées?
  3. Y a-t-il des dépendances entre les versions de Framework?



Answers


Le registre est le moyen officiel de détecter si une version spécifique du Framework est installée.

Les clés de registre nécessaires sont modifiées en fonction de la version de Framework que vous recherchez:

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

Généralement vous recherchez:

"Install"=dword:00000001

sauf pour .NET 1.0, où la valeur est une chaîne ( REG_SZ ) plutôt qu'un nombre ( REG_DWORD ).

La détermination du niveau du Service Pack suit un modèle similaire:

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

Comme vous pouvez le voir, déterminer le niveau SP pour .NET 1.0 change si vous utilisez Windows Media Center ou Windows XP Tablet Edition. Encore une fois, .NET 1.0 utilise une valeur de chaîne alors que tous les autres utilisent un DWORD.

Pour .NET 1.0, la valeur de la chaîne de l'une ou l'autre de ces clés est au format #, #, ####, #. Le dernier # est le niveau du Service Pack.

Bien que je ne l'ai pas explicitement demandé, si vous voulez connaître le numéro de version exact du Framework, vous utiliserez ces clés de registre:

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)

Encore une fois, .NET 1.0 utilise une valeur de chaîne alors que tous les autres utilisent un DWORD.

Notes complémentaires

  • Pour .NET 1.0, la valeur de la chaîne de l'une de ces clés est au format #,#,####,# . La partie #,#,#### de la chaîne est la version Framework.

  • Pour .NET 1.1, nous utilisons le nom de la clé de registre elle-même, qui représente le numéro de version.

  • Enfin, si vous observez les dépendances, .NET 3.0 ajoute des fonctionnalités supplémentaires à .NET 2.0, de sorte que .NET 2.0 et .NET 3.0 doivent tous les deux s'évaluer comme étant installés pour indiquer correctement que .NET 3.0 est installé. De même, .NET 3.5 ajoute des fonctionnalités supplémentaires à .NET 2.0 et .NET 3.0, ainsi .NET 2.0, .NET 3.0 et .NET 3. Tous devraient être évalués pour être installés correctement pour dire que .NET 3.5 est installé.

  • .NET 4.0 installe une nouvelle version du CLR (CLR version 4.0) qui peut fonctionner côte à côte avec CLR 2.0.

Mise à jour pour .NET 4.5

Il n'y aura pas de clé v4.5 dans le registre si .NET 4.5 est installé. Au lieu de cela, vous devez vérifier si la HKLM\Software\Microsoft\NET Framework Setup\NDP\v4\Full contient une valeur appelée Release . Si cette valeur est présente, .NET 4.5 est installé, sinon ce n'est pas le cas. Plus de détails peuvent être trouvés ici et ici .




Il existe une réponse Microsoft officielle à cette question dans l'article suivant de la base de connaissances:

Numéro d'article: 318785 - Dernière mise à jour: jeudi 7 novembre 2008 - Version: 20.1 Comment déterminer quelles versions de .NET Framework sont installées et si des Service Packs ont été appliqués

Malheureusement, cela ne semble pas fonctionner, car la version de mscorlib.dll dans le répertoire 2.0 a une version 2.0, et il n'y a pas de version de mscorlib.dll dans les répertoires 3.0 ou 3.5 même si 3.5 SP1 est installé ... pourquoi? la réponse officielle de Microsoft serait-elle si mal informée?




La version bêta de Framework 4 s'installe sur une clé de registre différente.

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



Énumérer les sous-clés de HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP . Chaque sous-clé est une version .NET . Il doit avoir la valeur Install=1 si elle est présente sur la machine, une valeur SP indiquant le Service Pack et une valeur MSI=1 si elle a été installée à l'aide d'un MSI. (.NET 2.0 sur Windows Vista n'a pas le dernier par exemple, car il fait partie du système d'exploitation.)




Je voulais détecter la présence de .NET version 4.5.2 installé sur mon système, et je n'ai pas trouvé de meilleure solution que ASoft .NET Version Detector .

Instantané de cet outil montrant différentes versions de .NET:







Pour un système d'exploitation 64 bits, le chemin serait:

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



Mise à jour pour .NET 4.5.1

Maintenant que .NET 4.5.1 est disponible, la valeur réelle de la clé nommée Release dans le registre doit être vérifiée, pas seulement son existence. Une valeur de 378758 signifie que .NET Framework 4.5.1 est installé. Cependant, comme décrit ici, cette valeur est 378675 sur Windows 8.1.




Il existe un outil graphique disponible, ASoft .NET Version Detector , qui s'est toujours avéré très fiable. Il peut créer des fichiers XML en spécifiant le nom de fichier de la sortie XML sur la ligne de commande.

Vous pourriez l'utiliser pour l'automatisation. C'est un programme minuscule, écrit dans un langage non-dépendant de NET et ne nécessite pas d'installation.




J'avais besoin de savoir quelle version du framework .NET j'avais sur mon ordinateur, et tout ce que je faisais était d'aller dans le panneau de contrôle et de sélectionner l'option "Désinstaller un programme". Après cela, j'ai trié les programmes par nom et trouvé Microsoft .NET Framework 4 Client Profile.




Voici un script PowerShell pour obtenir les versions du framework .NET installées

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

Il a été écrit basé sur Comment: déterminer quelles versions .NET Framework sont installées . Veuillez utiliser la fonction Get-FrameworkVersion () pour obtenir des informations sur les versions de framework .NET installées.




En utilisant la bibliothèque Signum.Utilities de SignumFramework (que vous pouvez utiliser de manière autonome), vous pouvez l'obtenir facilement et sans traiter le registre par vous-même:

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












Dans Windows 7 (cela devrait aussi fonctionner pour Windows 8, mais je ne l'ai pas testé):

Aller à une invite de commande

Étapes à suivre pour une invite de commande:

  1. Cliquez sur le menu Démarrer
  2. Dans la zone de recherche, tapez "cmd" (sans les guillemets)
  3. Ouvrez cmd.exe

Dans cmd, tapez cette commande

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

Cela donne la dernière version de NET Framework installé.

On peut aussi essayer Raymond.cc Utilties pour le même.




Voir Procédure: déterminer les versions de .NET Framework installées (MSDN).

MSDN propose un exemple de fonction qui semble faire le travail pour la version 1-4. Selon l'article, la sortie de la méthode est:

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

Notez que pour "versions 4.5 et ultérieures" il y a une autre fonction.