Раньше это было легко, но Microsoft решила внести серьезное изменение: до версии 4.5 каждая версия .NET располагалась в своем собственном каталоге ниже C:\Windows\Microsoft.NET\Framework(подкаталоги v1.0.3705, v1.1.4322, v2.0.50727, v3.0, v3.5и v4.0.30319).
Начиная с версии 4.5 это было изменено: каждая версия .NET (т.е. 4.5.x, 4.6.x, 4.7.x, 4.8.x, ...) устанавливается в один и тот же подкаталог, v4.0.30319поэтому вы больше не можете проверьте установленную версию .NET, заглянув вMicrosoft.NET\Framework .
Чтобы проверить версию .NET, Microsoft предоставила два разных примера сценария в зависимости от проверяемой версии .NET, но мне не нравится иметь для этого два разных сценария C #. Поэтому я попытался объединить их в один, вот сценарий, который GetDotNetVersion.csя создал (и обновил его для платформы 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;
}
}
На моей машине он выводит:
v2.0.50727 2.0.50727.4927 SP2
v3.0 3.0.30729.4926 SP2
v3.5 3.5.30729.4926 SP1
v4
Client 4.7.03056
Полный 4.7.03056
v4.0
Client 4.0.0.0
Версия .NET Framework: 4.7.2 или более поздняя
*** * Максимальный найденный номер версии .NET: 4.7.2 или новее ****
Единственное, что необходимо поддерживать с течением времени, - это номер сборки после выхода версии .NET выше 4.7.1 - это можно легко сделать, изменив функцию CheckFor45PlusVersion, вам нужно знать ключ выпуска для новой версии, тогда вы можно добавить. Например:
if (releaseKey >= 461308) return "4.7.1 or later";
Этот ключ выпуска по-прежнему является последним и действителен для обновления Fall Creators для Windows 10. Если вы все еще используете другие (более старые) версии Windows, существует еще одна, согласно этой документации от Microsoft:
.NET Framework 4.7.1 установлен на всех остальных версиях ОС Windows 461310
Итак, если вам это тоже нужно, вам придется добавить
if (releaseKey >= 461310) return "4.7.1 or later";
в начало функции CheckFor45PlusVersion. Аналогично это работает для более новых версий. Например, недавно я добавил чек на 4.8. Эти номера сборок обычно можно найти в Microsoft.
Примечание. Для установки не требуется Visual Studio, даже PowerShell - вы можете использовать его csc.exeдля компиляции и запуска приведенного выше сценария, который я описал здесь.
Обновление: вопрос касается .NET Framework, для полноты картины я хотел бы упомянуть, как запрашивать версию .NET Core - по сравнению с приведенным выше, это просто: откройте командную оболочку и введите:
dotnet --info Enter
и в нем будет указан номер версии .NET Core, версия Windows и версии каждой связанной DLL среды выполнения. Пример вывода:
.NET Core SDK (отражающий любой global.json):
Версия: 2.1.300 Фиксация
: adab45bf0c Среда
выполнения:
Имя
ОС: Версия ОС Windows
: 10.0.15063
Платформа ОС: Windows
RID: win10-x64
Базовый путь: C: \ Program Files \ dotnet \ sdk \ 2.1.300
Хост (полезно для поддержки):
Версия: 2.1.0
Фиксация: caa7b7e2ba
Установленные SDK .NET Core:
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:
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]
Чтобы установить дополнительные среды выполнения .NET Core или SDK:
https://aka.ms/dotnet-download
Обратите внимание, что
если вам нужен только номер версии без всей дополнительной информации, вы можете использовать
dotnet --version.
на 64 битной Windows ПК , можно установить x86 версии бок о бок с 64 - разрядной версии .NET Core. В этом случае вы получите только ту версию, которая указана первой в переменной среды PATH. Это особенно важно, если вам нужно поддерживать его в актуальном состоянии и вы хотите знать каждую версию. Чтобы запросить обе версии, используйте:
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
В приведенном выше примере оба одинаковые, но если вы забыли обновить оба экземпляра, вы можете получить разные результаты! Обратите внимание , что Program Filesэто для 64 - битной версии, и Program Files (x86)это 32 - разрядная версия.
Обновление: если вы предпочитаете хранить номера сборок в списке, а не в каскаде операторов if (как предложила Microsoft), вы можете использовать этот код CheckFor45PlusVersionвместо:
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()вероятно, просто возвращает версию CLR.