94 votes

Existe-t-il un moyen simple de vérifier la version de .NET Framework ?

Le problème est que j'ai besoin de savoir si c'est la version 3.5 SP 1. Environment.Version() uniquement les retours 2.0.50727.3053 .

J'ai trouvé cette solution mais je pense que cela prendra beaucoup plus de temps que cela n'en vaut la peine, alors je cherche une solution plus simple. Est-ce possible ?

2 votes

Sans autre forme de procès, Environment.Version() ne renvoie probablement que la version du CLR.

0 votes

Environment.Version() donne 2.0 même s'il fonctionne avec 3.5

0 votes

J'ai utilisé l'approche mentionnée dans stackoverflow.com/questions/15128426/

114voto

Factor Mystic Points 12465

Quelque chose comme ça devrait le faire. Il suffit de récupérer la valeur du registre

Pour .NET 1-4 :

Framework est la plus haute version installée, SP est le service pack pour cette version.

RegistryKey installed_versions = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP");
string[] version_names = installed_versions.GetSubKeyNames();
//version names start with 'v', eg, 'v3.5' which needs to be trimmed off before conversion
double Framework = Convert.ToDouble(version_names[version_names.Length - 1].Remove(0, 1), CultureInfo.InvariantCulture);
int SP = Convert.ToInt32(installed_versions.OpenSubKey(version_names[version_names.Length - 1]).GetValue("SP", 0));

Pour .NET 4.5 et plus (de documentation officielle ) :

using System;
using Microsoft.Win32;

...

private static void Get45or451FromRegistry()
{
    using (RegistryKey ndpKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).OpenSubKey("SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v4\\Full\\")) {
        int releaseKey = Convert.ToInt32(ndpKey.GetValue("Release"));
        if (true) {
            Console.WriteLine("Version: " + CheckFor45DotVersion(releaseKey));
        }
    }
}

...

// Checking the version using >= will enable forward compatibility,  
// however you should always compile your code on newer versions of 
// the framework to ensure your app works the same. 
private static string CheckFor45DotVersion(int releaseKey)
{
    if (releaseKey >= 528040) {
        return "4.8 or later";
    }
    if (releaseKey >= 461808) {
        return "4.7.2 or later";
    }
    if (releaseKey >= 461308) {
        return "4.7.1 or later";
    }
    if (releaseKey >= 460798) {
        return "4.7 or later";
    }
    if (releaseKey >= 394802) {
        return "4.6.2 or later";
    }
    if (releaseKey >= 394254) {
        return "4.6.1 or later";
    }
    if (releaseKey >= 393295) {
        return "4.6 or later";
    }
    if (releaseKey >= 393273) {
        return "4.6 RC or later";
    }
    if ((releaseKey >= 379893)) {
        return "4.5.2 or later";
    }
    if ((releaseKey >= 378675)) {
        return "4.5.1 or later";
    }
    if ((releaseKey >= 378389)) {
        return "4.5 or later";
    }
    // This line should never execute. A non-null release key should mean 
    // that 4.5 or later is installed. 
    return "No 4.5 or later version detected";
}

0 votes

La chaîne de version longue ainsi que la sous-clé SP pour chaque SOFTWARE \Microsoft\NET Configuration du cadre \NDP\ La version <.net> devrait fournir ceci, que vous pouvez saisir avec la méthode GetValue.

0 votes

Au niveau de la v3.5, il y a une clé appelée SP. La valeur est le niveau du Service Pack.

0 votes

N'oubliez pas d'appeler Close sur la clé ouverte à l'aide de OpenSubKey !

11voto

quillbreaker Points 2843

Environment.Version() donne la bonne réponse à une autre question. La même version du CLR est utilisée dans .NET 2.0, 3 et 3.5. Je suppose que vous pourriez vérifier le CAG pour les bibliothèques qui ont été ajoutées dans chacune de ces versions ultérieures.

3 votes

Environment.Version() donne 2.0 même s'il fonctionne avec 3.5

6 votes

Environment.Version() vous donne le nom du CLR. 3.5 n'est pas une nouvelle version du CLR. C'est la 2.0 plus quelques bibliothèques supplémentaires avec un incrément marketing de 1.5.

8 votes

La réponse est trompeuse. Le CLR 2.0 est utilisé pour .NET 2.0, 3.0 et 3.5. Le CLR a changé avec la version 4. CLR 4.0 est utilisé pour .NET 4.0.

6voto

Darin Dimitrov Points 528142

A priori, il n'y a pas de méthode intégrée dans le framework qui vous permette de le faire. Vous pouvez vérifier ceci poste pour une suggestion sur la détermination de la version du framework en lisant les valeurs du registre de Windows.

2voto

Cecil Has a Name Points 3385

Sans autre forme de procès, Environment.Version() ne renvoie probablement que la version du CLR.

2voto

pasx Points 21

Merci pour cet article qui m'a été très utile. J'ai dû le modifier un peu afin de vérifier le framework 2.0 car la clé de registre ne peut pas être convertie directement en double. Voici le code :

string[] version_names = rk.GetSubKeyNames();
//version names start with 'v', eg, 'v3.5'
//we also need to take care of strings like v2.0.50727...
string sCurrent = version_names[version_names.Length - 1].Remove(0, 1);
if (sCurrent.LastIndexOf(".") > 1)
{
    string[] sSplit = sCurrent.Split('.');
    sCurrent = sSplit[0] + "." + sSplit[1] + sSplit[2];
}
double dCurrent = Convert.ToDouble(sCurrent, System.Globalization.CultureInfo.InvariantCulture);
double dExpected = Convert.ToDouble(sExpectedVersion);
if (dCurrent >= dExpected)

4 votes

Vous ne devriez vraiment pas stocker les numéros de version dans des doubles. Ils sont susceptibles d'être arrondis. Utilisez des décimales.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X