Comment détecter les versions et les Service Packs de .NET Framework installés?

289

Une question similaire a été posée ici , mais elle était spécifique à .NET 3.5. Plus précisément, je recherche les éléments suivants:

  1. Quelle est la bonne façon de déterminer quelles versions de .NET Framework et Service Packs sont installés?
  2. Existe-t-il une liste de clés de registre pouvant être utilisées?
  3. Existe-t-il des dépendances entre les versions de Framework?
Scott Dorman
la source
2
Cette question est étroitement liée à stackoverflow.com/questions/198931/… et stackoverflow.com/questions/182910/…
Pascal Paradis
Oui, ça l'est. Je connaissais déjà la première (c'est celle à laquelle je fais référence dans ma question). Je ne connaissais pas l'autre.
Scott Dorman
3
Je suis impressionné de voir comment cette question (y compris les réponses) et toutes les questions étroitement liées ignorent complètement la présence des valeurs SKU - cela fait même la différence entre 4.5 et 4.5.1.
springy76
@ springy76, La raison pour laquelle cela ne résout pas la présence de valeurs SKU est que, pour déterminer quelles versions du Framework sont installées, elles ne sont pas pertinentes. La question à laquelle vous vous référez tente en fait de déterminer si ".NET 4.0.2" est installé. Le problème ici est qu'il n'y avait pas de .NET 4.0.2, c'était une mise à jour (KB2544514), pas une version Framework ou un service pack. Vous pouvez consulter cet article sur MSDN ( msdn.microsoft.com/en-us/library/hh925567(v=vs.110).aspx ) pour plus d'informations sur la détection des mises à jour installées.
Scott Dorman
Vous avez ici Vérifiez quelle version de .net ...
DanielV

Réponses:

365

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

entrez la description de l'image ici

Quelles clés de registre sont nécessaires en fonction de la version du Framework que vous recherchez:

Clé de Registre de version de 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 Profil client HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Client \ Install
4.0 Profil complet HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Full \ Install

En général, 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:

Clé de Registre de version de Framework
-------------------------------------------------- ----------------------------------------
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 Profil client HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Client \ Servicing
4.0 Profil complet HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Full \ Servicing

[1] Windows Media Center ou Windows XP Tablet Edition

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

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

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

Clé de Registre de version de Framework
-------------------------------------------------- ----------------------------------------
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 Profil client HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Version 
4.0 Profil complet HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Version 

[1] Windows Media Center ou 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 tandis que tous les autres utilisent un DWORD.

Notes complémentaires

  • pour .NET 1.0, la valeur de chaîne à l'une de ces clés a un format de #,#,####,#. 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 examinez les dépendances, .NET 3.0 ajoute des fonctionnalités supplémentaires à .NET 2.0, donc .NET 2.0 et .NET 3.0 doivent tous deux être évalués 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, donc .NET 2.0, .NET 3.0 et .NET 3. doivent tous être évalués comme étant installés pour indiquer correctement que .NET 3.5 est installé.

  • .NET 4.0 installe une nouvelle version du CLR (CLR version 4.0) qui peut s'exécuter côte à côte avec CLR 2.0.

Mise à jour pour .NET 4.5

Il n'y aura pas de v4.5clé 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\Fullclé contient une valeur appelée Release. Si cette valeur est présente, .NET 4.5 est installé, sinon il ne l'est pas. Plus de détails peuvent être trouvés ici et ici .

Scott Dorman
la source
1
Cela ne semble pas fonctionner pour .NET 1.1 sous Vista x64. Aucune clé v1.1.x ne se trouve dans aucun des emplacements possibles. Des idées?
Chris Hynes
7
Les clés de .NET 4.0 ne sont pas tout à fait correctes. Je vois ces clés: HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Client \ Install HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Full \ Install Le dossier v4.0 n'a qu'une seule clé , (Par défaut) avec une valeur obsolète.
RandomEngy
2
Ce message ne couvre pas 4.5 et 4.5 n'est pas répertorié dans le registre même s'il est installé.
Klas Mellbourn
37
Mec, personne chez Microsoft n'a pensé à ajouter un commutateur -version?
gnuchu
2
C'est une blague. Je ne peux pas croire que c'est tellement stupide!
Alex Byrth
17

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

ID d'article: 318785 - Dernière révision: 7 novembre 2008 - Révision: 20.1 Comment déterminer quelles versions du .NET Framework sont installées et si les Service Packs ont été appliqués

Malheureusement, cela ne semble pas fonctionner, car la version mscorlib.dll dans le répertoire 2.0 a une version 2.0, et il n'y a pas de version 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?

anon
la source
2
+1 - Il semble que Microsoft ait mis à jour cette page depuis que vous y avez créé un lien. Il semble donc que cela pourrait être l'une des meilleures sources officielles en la matière.
jpierson
2
Il ne monte que jusqu'à 4.0
user316117
16

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);
            }
        }
    }
}
midspace
la source
1
Changez Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP", true)pour Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP")éviter une exception de sécurité sur les utilisateurs non administrateurs.
Jon Cage
Cool, j'ai utilisé LinqPad et ça m'a donné des résultats parfaits! share.linqpad.net/5cjihh.linq
user917170
Il est étrange que vous partagiez de petits détails (comme la version du Service Pack installée) mais les informations les plus importantes (si le framework n'est installé que partiellement ou complètement) sont ignorées par votre code !! Il est incorrect de traiter les clés de registre "Client" et "Complet" comme si elles étaient identiques. Si seule la touche "Client" se ferme par exemple, System.Web ne sera pas disponible. Ces informations importantes doivent également être retournées par votre code! Si l'utilisateur a désinstallé ".NET Framework 4 Extended" dans le Panneau de configuration, il manque plusieurs assemblys.
Elmue
8

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

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

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

Faisal Mq
la source
7

É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 une Install=1valeur s'il est présent sur la machine, une valeur SP qui affiche le Service Pack et une MSI=1valeur s'il a été installé à 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.)

Franci Penov
la source
Je n'ai pas trouvé cette clé sur ma machine (XP Pro), mais je l'avais: HKLM \ SOFTWARE \ Microsoft \ .NETFramework. Cependant, les différentes valeurs que vous décrivez n'existent pas pour moi.
Charlie
Vous devez avoir cette clé si vous avez installé .NET 1.1 ou version ultérieure. La clé que vous avez mentionnée n'a été utilisée que pour .NET 1.0.
Scott Dorman
requête de reg "HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ NET Framework Setup \ NDP"
enthousiaste
5

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

HKEY_LOCAL_MACHINE\SOFTWARE\wow6432Node\Microsoft\NET Framework Setup\NDP\
abhishek mehta
la source
10
Ce n'est que "quelque peu" vrai. Le registre dans les versions 64 bits de Windows est divisé en clés 32 bits et 64 bits (de nombreuses clés 32 bits ayant le même nom que les clés 64 bits). La Wow6432Nodeclé de registre fait partie du réflecteur de registre WOW64, qui reflète certaines clés et valeurs entre les vues de registre 64 bits et 32 ​​bits. Il ne devrait pas être nécessaire d'accéder directement à cette clé car le registre gère automatiquement la redirection et la mise en miroir.
Scott Dorman
5

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 sous Windows 8.1.

JasonMcF
la source
5

Il existe un outil GUI disponible, ASoft .NET Version Detector , qui s'est toujours révélé 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 pouvez l'utiliser pour l'automatisation. Il s'agit d'un petit programme, écrit dans un langage non dépendant de NET et ne nécessitant pas d'installation.

CarlR
la source
4

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

Kudzai K
la source
1
Merci - Toutes les autres "solutions" que j'ai essayées étaient défectueuses et ne fonctionneraient pas. C'était le cas.
user20493
La raison pour laquelle je suis venu à la recherche de ces informations était que les éléments sous Désinstaller un programme ne sont absolument pas fiables, du moins en ce qui concerne .NET Framework.
tobbenb3
3

Voici un script PowerShell pour obtenir les versions de 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é rédigé sur la base de Comment: déterminer quelles versions de .NET Framework sont installées . Veuillez utiliser la fonction Get-FrameworkVersion () pour obtenir des informations sur les versions de framework .NET installées.

cezarypiatek
la source
2

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

AboutTools.FrameworkVersions().ToConsole();
//Writes in my machine:
//v2.0.50727 SP2
//v3.0 SP2
//v3.5 SP1
mapache
la source
2
En regardant le code de cette méthode, il n'est pas très complet en ce qui concerne les clés de registre qu'il utilise et manquera complètement .NET 1.0 et ne fait pas de distinction entre .NET 2.0 (RTM) et .NET 2.0 SP1. Il ne prend pas non plus en compte les dépendances entre les versions du framework.
Scott Dorman
2
Pas une bonne solution. Il n'y a aucune bonne raison de télécharger une bibliothèque entière juste pour obtenir la version .NET lorsque vous pouvez faire le même travail vous-même dans environ 3 lignes de code. En tant que programmeur, vous DEVRIEZ être en mesure de "gérer vous-même le registre".
TheSmurf
3
@DannySmurf Je ne suis pas d'accord. Lorsque .NET 3.0 a été introduit, MS aurait dû envelopper cela dans une API .NET (dès que nous avions plus d'une couche de FX sur le même CLR). Je préfère que mon application utilise une bibliothèque d'utilitaires, puis lorsque 4.1, 6.1, 7.100 arrive, je peux simplement mettre à jour la bibliothèque et une entrée de configuration pour quelle couche de .NET mon application nécessite. Bien sûr, cet argument ne tient pas si aucune des bibliothèques ne fonctionne.
yzorg
1

Voir Comment: 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 les "versions 4.5 et supérieures", il existe une autre fonction.

Olivier de Rivoyre
la source
1

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

Accédez à une invite de commande

Étapes pour accéder à une invite de commande:

  1. Cliquez sur le menu Démarrer
  2. Dans la zone de recherche, tapez "cmd" (sans 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ée.

On peut également essayer Raymond.cc Utilties pour la même chose.

Mayank Agarwal
la source
1
Courir cette ligne cmdme donne ERROR: Description = Invalid namespace.
MEMark
je reçois aussiERROR: Description = Invalid namespace
Peter
Cette commande me donne une erreur! (exécuté à partir du terminal Windows 7)
Smrita
Merci MEMark, Peter, Smrita pour l'avoir notifié.
Mayank Agarwal