web-dev-qa-db-fra.com

Comment trouver la version de l'exécution .NET par programme?

J'ai besoin d'une solution pour me donner la version .NET run-time du framework complet ainsi que le .NET Core .

Sur une machine avec les versions .NET suivantes:

Full: 4.7.2
Core: 2.1.104

Fonctionnement:

RuntimeInformation.FrameworkDescription

Donne moi:

Full: .NET Framework 4.7.2558.0
Core: .NET Core 4.6.26212.01

Fonctionnement:

Environment.Version

Donne moi: 

Full: 4.0.30319.42000
Core: 4.0.30319.42000

Comment obtenir avec précision les versions au moment de l'exécution sur différentes plates-formes, sachant que l'option de registre n'est pas disponible en dehors de Windows .

7
MaYaN

Il n'y a pas encore de méthode unifiée pour le faire, bien qu'il y ait une demande ouverte pour ce ici que vous pouvez suivre. Si vous cliquez sur les différents problèmes qui font référence à cette discussion et sur ceux qui sont référencés plus en aval, vous remarquerez qu’il existe actuellement quelques bugs dans certaines mises en œuvre, mais que le travail est actif (un des problèmes avait un enregistrement connexe il y a 8 heures).

Pour .NET Framework:

using System;
...
string ver = AppDomain.CurrentDomain.SetupInformation.TargetFrameworkName;

et pour .NET Core:

using System.Reflection;
using System.Runtime.Versioning;
...
string ver = Assembly.GetEntryAssembly()?.GetCustomAttribute<TargetFrameworkAttribute>()?.FrameworkName;

Sortie:

.NETFramework,Version=v4.5.1
.NETCoreApp,Version=v2.0

Évidemment, ces opérations sont un peu fastidieuses à utiliser par programmation, d’où les demandes pour une meilleure API (y compris le this } numéro ouvert de Microsoft qui discute d’une nouvelle API spécifiquement conçue pour tester un framework cible minimum).

L'autre pièce du puzzle qui sera probablement toujours impossible est qu'une application donnée puisse faire référence à plusieurs cibles. Sous le capot, vous pouvez par exemple utiliser des bibliothèques .NET Standard 2.x et .NET Standard 1.x. Je doute qu'il y ait toujours un bon moyen d'obtenir une image complète de toutes les cibles situées derrière un ensemble donné d'assemblages d'exécution ...

7
McGuireV10

Si vous voulez savoir quelle version de .NET Framework est installée sur un ordinateur, vous devez utiliser la clé de registre documentée «Release Key». Cette clé est enregistrée dans le système lorsque .NET Framework est installé.

Ceci est documenté publiquement ici: https://docs.Microsoft.com/en-us/dotnet/framework/migration-guide/versions-and-dependencies

Vous devez écrire le code qui lira cette clé de registre et le mapper à une version réelle du .NET Framework. Voici le code qui fait cela pour les versions de .NET Framework entre 4.5 et 4.7.1. Vous pouvez personnaliser davantage comme vous le souhaitez. (from https://github.com/dotnet/corefx/blob/master/src/CoreFx.Private.TestUtilities/src/System/PlatformDetection.NetFx.cs#L33 )

    private static Version GetFrameworkVersion()
    {
        using (RegistryKey ndpKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full"))
        {
            if (ndpKey != null)
            {
                int value = (int)(ndpKey.GetValue("Release") ?? 0);
                if (value >= 461308)
                    return new Version(4, 7, 1);

                if (value >= 460798)
                    return new Version(4, 7, 0);

                if (value >= 394802)
                    return new Version(4, 6, 2);

                if (value >= 394254)
                    return new Version(4, 6, 1);

                if (value >= 393295)
                    return new Version(4, 6, 0);

                if (value >= 379893)
                    return new Version(4, 5, 2);

                if (value >= 378675)
                    return new Version(4, 5, 1);

                if (value >= 378389)
                    return new Version(4, 5, 0);

                throw new NotSupportedException($"No 4.5 or later framework version detected, framework key value: {value}");
            }

            throw new NotSupportedException(@"No registry key found under 'SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full' to determine running framework version");
        }
    }

Je sais que vous avez dit que vous ne souhaitiez pas utiliser le registre. Toutefois, je vous recommande d’utiliser le chemin du registre si vous utilisez le .NET Framework (vous pouvez le détecter en consultant le chemin où Assembly contenant System.Object est chargé) comme c'est la méthode recommandée et prise en charge (nous utilisons la même chose dans le Runtime .NET lorsque nous devons vérifier quelle version est installée sur une machine).

Pour .NET Core, aucune clé de registre ne peut être vérifiée. Toutefois, vous pouvez utiliser l'emplacement de l'assembly contenant System.Object pour identifier la version sur laquelle votre code est exécuté.

    public static Version GetVersion()
    {
        string runtimePath = System.IO.Path.GetDirectoryName(typeof(object).Assembly.Location);
        // Making the assumption that the path looks like this
        // C:\Program Files\dotnet\shared\Microsoft.NETCore.App\2.0.6
        string version = runtimePath.Substring(runtimePath.LastIndexOf('\\') + 1);

        return new Version(version);
    }
1