Kiedyś było to łatwe, ale Microsoft zdecydował się na przełomową zmianę: przed wersją 4.5 każda wersja .NET znajdowała się w swoim własnym katalogu poniżej C:\Windows\Microsoft.NET\Framework(podkatalogi v1.0.3705, v1.1.4322, v2.0.50727, v3.0, v3.5i v4.0.30319).
Od wersji 4.5 zostało to zmienione: każda wersja .NET (tj. 4.5.x, 4.6.x, 4.7.x, 4.8.x, ...) jest instalowana w tym samym podkatalogu v4.0.30319- więc nie możesz już sprawdź zainstalowaną wersję .NET, zaglądając do Microsoft.NET\Framework.
Aby sprawdzić wersję .NET, firma Microsoft udostępniła dwa różne przykładowe skrypty w zależności od wersji .NET, która jest sprawdzana, ale nie podoba mi się posiadanie dwóch różnych skryptów C # do tego. Spróbowałem więc połączyć je w jeden, oto skrypt, GetDotNetVersion.csktóry stworzyłem (i zaktualizowałem do frameworka 4.7.1):
using System;
using Microsoft.Win32;
public class GetDotNetVersion
{
public static void Main(string[] args)
{
Console.WriteLine((args != null && args.Length > 0)
? "Command line arguments: " + string.Join(",", args)
: "");
string maxDotNetVersion = GetVersionFromRegistry();
if (String.Compare(maxDotNetVersion, "4.5") >= 0)
{
string v45Plus = GetDotNetVersion.Get45PlusFromRegistry();
if (v45Plus != "") maxDotNetVersion = v45Plus;
}
Console.WriteLine("*** Maximum .NET version number found is: " + maxDotNetVersion + "***");
}
private static string Get45PlusFromRegistry()
{
String dotNetVersion = "";
const string subkey = @"SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full\";
using (RegistryKey ndpKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).OpenSubKey(subkey))
{
if (ndpKey != null && ndpKey.GetValue("Release") != null)
{
dotNetVersion = CheckFor45PlusVersion((int)ndpKey.GetValue("Release"));
Console.WriteLine(".NET Framework Version: " + dotNetVersion);
}
else
{
Console.WriteLine(".NET Framework Version 4.5 or later is not detected.");
}
}
return dotNetVersion;
}
private static string CheckFor45PlusVersion(int releaseKey)
{
if (releaseKey >= 528040) return "4.8 or later";
if (releaseKey >= 461808) return "4.7.2";
if (releaseKey >= 461308) return "4.7.1";
if (releaseKey >= 460798) return "4.7";
if (releaseKey >= 394802) return "4.6.2";
if (releaseKey >= 394254) return "4.6.1";
if (releaseKey >= 393295) return "4.6";
if ((releaseKey >= 379893)) return "4.5.2";
if ((releaseKey >= 378675)) return "4.5.1";
if ((releaseKey >= 378389)) return "4.5";
return "No 4.5 or later version detected";
}
private static string GetVersionFromRegistry()
{
String maxDotNetVersion = "";
using (RegistryKey ndpKey = RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, "")
.OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP\"))
{
foreach (string versionKeyName in ndpKey.GetSubKeyNames())
{
if (versionKeyName.StartsWith("v"))
{
RegistryKey versionKey = ndpKey.OpenSubKey(versionKeyName);
string name = (string)versionKey.GetValue("Version", "");
string sp = versionKey.GetValue("SP", "").ToString();
string install = versionKey.GetValue("Install", "").ToString();
if (install == "")
{
Console.WriteLine(versionKeyName + " " + name);
if (String.Compare(maxDotNetVersion, name) < 0) maxDotNetVersion = name;
}
else
{
if (sp != "" && install == "1")
{
Console.WriteLine(versionKeyName + " " + name + " SP" + sp);
if (String.Compare(maxDotNetVersion, name) < 0) maxDotNetVersion = name;
}
}
if (name != "")
{
continue;
}
foreach (string subKeyName in versionKey.GetSubKeyNames())
{
RegistryKey subKey = versionKey.OpenSubKey(subKeyName);
name = (string)subKey.GetValue("Version", "");
if (name != "")
{
sp = subKey.GetValue("SP", "").ToString();
}
install = subKey.GetValue("Install", "").ToString();
if (install == "")
{
Console.WriteLine(versionKeyName + " " + name);
if (String.Compare(maxDotNetVersion, name) < 0) maxDotNetVersion = name;
}
else
{
if (sp != "" && install == "1")
{
Console.WriteLine(" " + subKeyName + " " + name + " SP" + sp);
if (String.Compare(maxDotNetVersion, name) < 0) maxDotNetVersion = name;
}
else if (install == "1")
{
Console.WriteLine(" " + subKeyName + " " + name);
if (String.Compare(maxDotNetVersion, name) < 0) maxDotNetVersion = name;
}
}
}
}
}
}
return maxDotNetVersion;
}
}
Na moim komputerze wyświetla:
2.0.50727 2.0.50727.4927 SP2
v3.0 3.0.30729.4926 SP2
v3.5 3.5.30729.4926 SP1
v4
Klient 4.7.03056
Pełna 4.7.03056
v4.0
Klient 4.0.0.0
.NET Framework Wersja: 4.7.2 lub nowsza
*** * Maksymalny znaleziony numer wersji .NET to: 4.7.2 lub nowszy ****
Jedyną rzeczą, którą należy utrzymać w czasie, jest numer kompilacji, gdy pojawi się wersja .NET wyższa niż 4.7.1 - można to łatwo zrobić, modyfikując funkcję CheckFor45PlusVersion, musisz znać klucz wydania nowej wersji, a następnie można to dodać. Na przykład:
if (releaseKey >= 461308) return "4.7.1 or later";
Ten klucz wydania jest nadal najnowszy i ważny dla aktualizacji Fall Creators dla systemu Windows 10. Jeśli nadal korzystasz z innych (starszych) wersji systemu Windows, istnieje inna zgodna z tą dokumentacją firmy Microsoft:
NET Framework 4.7.1 zainstalowany we wszystkich innych wersjach systemu operacyjnego Windows 461310
Więc jeśli tego również potrzebujesz, musisz dodać
if (releaseKey >= 461310) return "4.7.1 or later";
na górę funkcji CheckFor45PlusVersion. Podobnie działa w nowszych wersjach. Na przykład ostatnio dodałem czek na 4.8. Te numery kompilacji można znaleźć zwykle w firmie Microsoft.
Uwaga: nie potrzebujesz do zainstalowania Visual Studio, nawet PowerShell - możesz użyć csc.exedo skompilowania i uruchomienia powyższego skryptu, który opisałem tutaj.
Aktualizacja: Pytanie dotyczy .NET Framework, ze względu na kompletność chciałbym również wspomnieć, jak zapytać o wersję .NET Core - w porównaniu z powyższym, to jest łatwe: Otwórz powłokę poleceń i wpisz:
dotnet --info Enter
i wyświetli numer wersji .NET Core, wersję systemu Windows i wersje każdej powiązanej biblioteki DLL środowiska wykonawczego. Przykładowe dane wyjściowe:
NET Core SDK (odzwierciedlający dowolny global.json):
wersja: 2.1.300
Commit: adab45bf0c
Środowisko wykonawcze:
nazwa systemu
operacyjnego : Windows Wersja systemu
operacyjnego: 10.0.15063
Platforma systemu operacyjnego: Windows
RID: win10-x64
ścieżka podstawowa: C: \ Program Files \ dotnet \ sdk \ 2.1.300
Host (przydatne do obsługi):
Wersja: 2.1.0
Commit: caa7b7e2ba
.NET Core SDK zainstalowane:
1.1.9 [C: \ Program Files \ dotnet \ sdk]
2.1.102 [C: \ Program Files \ dotnet \ sdk]
...
2.1.300 [C: \ Program Files \ dotnet \ sdk]
.NET Core zainstalowane środowiska wykonawcze:
Microsoft.AspNetCore.All 2.1.0 [C: \ Program
Files \ dotnet \ shared \ Microsoft .AspNetCore.All]
...
Microsoft.NETCore.App 2.1.0 [C: \ Program Files \ dotnet \ shared \ Microsoft.NETCore.App]
Aby zainstalować dodatkowe środowiska wykonawcze lub SDK platformy .NET Core:
https://aka.ms/dotnet-download
Zwróć na to uwagę
jeśli potrzebujesz tylko numeru wersji bez wszystkich dodatkowych informacji, możesz użyć
dotnet --version.
na 64-bitowym systemie Windows PC , możliwe jest zainstalowanie x86 wersji obok siebie z x64 wersji .NET Core. W takim przypadku otrzymasz tylko wersję, która jest pierwsza w zmiennej środowiskowej PATH. Jest to szczególnie ważne, jeśli chcesz go aktualizować i chcesz znać każdą wersję. Aby zapytać o obie wersje, użyj:
C: \ Program Files \ dotnet \ dotnet.exe --version
3.0.100-preview6-012264
C: \ Program Files (x86) \ dotnet \ dotnet.exe --version
3.0.100-preview6-012264
W powyższym przykładzie oba są takie same, ale jeśli zapomniałeś zaktualizować obu instancji, możesz uzyskać różne wyniki! Zauważ, że Program Filesdotyczy to wersji 64-bitowej i Program Files (x86)jest to wersja 32-bitowa .
Aktualizacja: Jeśli wolisz zachować numery kompilacji na liście, a nie w kaskadzie instrukcji if (zgodnie z sugestią firmy Microsoft), możesz użyć tego kodu CheckFor45PlusVersionzamiast:
private static string CheckFor45PlusVersion(int releaseKey)
{
var release = new Dictionary<int, string>()
{
{ 378389, "4.5" },
{ 378675, "4.5.1" }, { 379893, "4.5.2" },
{ 393295, "4.6" },
{ 394254, "4.6.1" }, { 394802, "4.6.2" },
{ 460798, "4.7" },
{ 461308, "4.7.1" }, { 461808, "4.7.2" },
{ 528040, "4.8 or later" }
};
int result = -1;
foreach(var k in release.OrderBy(k=>k.Key))
{
if (k.Key <= releaseKey) result = k.Key; else break;
};
return (result > 0) ? release[result] : "No 4.5 or later version detected";
}
Environment.Version()prawdopodobnie po prostu zwraca wersję CLR.