wake-up-neo.com

Wie kann ich die .NET-Laufzeitversion programmgesteuert finden?

Ich brauche eine Lösung, um mir die .NET -Laufzeitversion sowohl des vollständigen Frameworks als auch des .NET Core zu geben.

Auf einem Rechner mit den folgenden Versionen von .NET :

Full: 4.7.2
Core: 2.1.104

Laufen:

RuntimeInformation.FrameworkDescription

Gibt mir:

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

Laufen:

Environment.Version

Gibt mir: 

Full: 4.0.30319.42000
Core: 4.0.30319.42000

Wie kann ich die Laufzeitversionen für verschiedene Plattformen genau ermitteln und wissen, dass die Registrierungsoption außerhalb von Windows nicht verfügbar ist.

7
MaYaN

Es gibt noch keinen einheitlichen Weg, dies zu tun, obwohl es eine offene Anfrage für diese hier die Sie finden können. Wenn Sie durch die verschiedenen Probleme klicken, die sich auf diese Diskussion beziehen, und auf die Probleme, auf die weiter unten verwiesen wird, werden in einigen Implementierungen jetzt auch einige Fehler angezeigt. Es gibt jedoch aktive Arbeit (bei einem der Probleme war nur das Einchecken der Probleme möglich vor 8 Stunden).

Für .NET Framework:

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

und für .NET Core:

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

Ausgabe:

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

Offensichtlich ist dies ein wenig umständlich für die programmgesteuerte Verwendung, daher die Anfragen nach einer besseren API (einschließlich this open - Problem von Microsoft, das eine neue API bespricht, die sich speziell auf das Testen eines Mindestzielframeworks konzentriert).

Der andere Teil des Puzzles, der wahrscheinlich immer unmöglich sein wird, besteht darin, dass eine bestimmte Anwendung viele Ziele referenzieren kann. Unter der Haube ziehen Sie beispielsweise in .NET Standard 2.x- und .NET Standard 1.x-Bibliotheken. Ich bezweifle, dass es jemals einen guten Weg geben wird, um ein komplettes Bild aller Ziele hinter einer bestimmten Sammlung von ausführenden Baugruppen zu erhalten ...

7
McGuireV10

Wenn Sie wissen möchten, welche Version von .NET Framework auf einem Computer installiert ist, sollten Sie den dokumentierten Registrierungsschlüssel 'Release Key' verwenden. Dieser Schlüssel wird bei der Installation von .NET Framework im System registriert.

Dies ist hier öffentlich dokumentiert: https://docs.Microsoft.com/de-de/dotnet/framework/migration-guide/versions-and-dependencies

Sie müssen den Code schreiben, der diesen Registrierungsschlüssel liest, und einer tatsächlichen .NET Framework-Version zuordnen. Hier ist der Code, der das für .NET Framework-Versionen zwischen 4.5 und 4.7.1 ausführt. Sie können das beliebig anpassen. (von 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");
        }
    }

Ich weiß, Sie sagten, dass Sie die Registrierung nicht verwenden möchten. Ich empfehle jedoch, den Registrierungspfad zu verwenden, wenn Sie unter .NET Framework ausgeführt werden (Sie können dies feststellen, indem Sie den Pfad betrachten, aus dem Assembly mit System.Object geladen wird) Dies ist die empfohlene und unterstützte Methode (wir verwenden dasselbe innerhalb der .NET Runtime, wenn wir prüfen müssen, welche Version auf einem Computer installiert ist).

Für .NET Core gibt es keinen Registrierungsschlüssel, den Sie überprüfen können. Sie können jedoch den Speicherort der Assembly verwenden, die System.Object enthält, um die Version zu identifizieren, auf der Ihr Code ausgeführt wird.

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