Điều đó từng dễ dàng, nhưng Microsoft đã quyết định thực hiện một thay đổi đột phá: Trước phiên bản 4.5, mỗi phiên bản .NET nằm trong C:\Windows\Microsoft.NET\Frameworkthư mục riêng của nó bên dưới (thư mục con v1.0.3705, v1.1.4322, v2.0.50727, v3.0, v3.5và v4.0.30319).
Kể từ phiên bản 4.5, điều này đã được thay đổi: Mỗi phiên bản .NET (tức là 4.5.x, 4.6.x, 4.7.x, 4.8.x, ...) đang được cài đặt trong cùng một thư mục con v4.0.30319- vì vậy bạn không còn có thể kiểm tra phiên bản .NET đã cài đặt bằng cách xem xét Microsoft.NET\Framework.
Để kiểm tra phiên bản .NET, Microsoft đã cung cấp hai tập lệnh mẫu khác nhau tùy thuộc vào phiên bản .NET đang được kiểm tra, nhưng tôi không thích có hai tập lệnh C # khác nhau cho việc này. Vì vậy, tôi đã cố gắng kết hợp chúng thành một, đây là tập lệnh GetDotNetVersion.cstôi đã tạo (và cập nhật nó cho khung 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;
}
}
Trên máy của tôi, nó xuất ra:
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
Full 4.7.03056
v4.0
Client 4.0.0.0
.NET Framework Phiên bản: 4.7.2 trở lên
*** * Số phiên bản .NET tối đa được tìm thấy là: 4.7.2 trở lên ****
Điều duy nhất cần được duy trì theo thời gian là số bản dựng khi phiên bản .NET lớn hơn 4.7.1 ra mắt - điều đó có thể được thực hiện dễ dàng bằng cách sửa đổi chức năng CheckFor45PlusVersion, bạn cần biết khóa phát hành cho phiên bản mới đó bạn. có thể thêm nó. Ví dụ:
if (releaseKey >= 461308) return "4.7.1 or later";
Đây chính phát hành vẫn là một trong những mới nhất và có giá trị trong bản cập nhật Fall Tạo Lập của Windows 10. Nếu bạn vẫn đang chạy (cũ) phiên bản Windows khác, có một khác theo này tài liệu từ Microsoft:
.NET Framework 4.7.1 được cài đặt trên tất cả các phiên bản HĐH Windows 461310 khác
Vì vậy, nếu bạn cũng cần điều đó, bạn sẽ phải thêm
if (releaseKey >= 461310) return "4.7.1 or later";
lên đầu hàm CheckFor45PlusVersion. Tương tự như vậy, nó hoạt động cho các phiên bản mới hơn. Ví dụ, tôi đã thêm séc cho 4,8 gần đây. Bạn có thể tìm thấy những con số xây dựng đó thường tại Microsoft.
Lưu ý: Bạn không cần cài đặt Visual Studio, thậm chí không phải PowerShell - bạn có thể sử dụng csc.exeđể biên dịch và chạy tập lệnh ở trên, mà tôi đã mô tả ở đây.
Cập nhật: Câu hỏi là về .NET Framework, vì lợi ích của sự đầy đủ, tôi muốn đề cập đến cách truy vấn phiên bản .NET Core - so với cách ở trên, điều đó thật dễ dàng: Mở lệnh shell và nhập:
dotnet --info Enter
và nó sẽ liệt kê số phiên bản .NET Core, phiên bản Windows và các phiên bản của từng DLL thời gian chạy liên quan. Đầu ra mẫu:
.NET Core SDK (phản ánh bất kỳ global.json):
Phiên bản: 2.1.300
Cam kết: adab45bf0c
Môi trường thời gian chạy:
Tên hệ điều hành: Windows
OS Phiên bản: 10.0.15063
Nền tảng hệ điều hành: Windows
RID: win10-x64
Đường dẫn cơ sở: C: \ Program Files \ dotnet \ sdk \ 2.1.300
Máy chủ (hữu ích để hỗ trợ):
Phiên bản: 2.1.0
Cam kết: caa7b7e2ba
.NET Core SDK được cài đặt:
1.1.9 [C: \ Program Files \ dotnet \ sdk]
2.1.102 [C: \ Program Files \ dotnet \ sdk]
...
2.1.300 [C: \ Program Files \ dotnet \ sdk]
Thời gian chạy .NET Core được cài đặt:
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]
Để cài đặt thêm SDK hoặc thời gian chạy .NET Core:
https://aka.ms/dotnet-download
Lưu ý rằng
nếu bạn chỉ cần số phiên bản mà không cần tất cả thông tin bổ sung, bạn có thể sử dụng
dotnet --version.
trên PC Windows 64 bit , có thể cài đặt phiên bản x86 song song với phiên bản x64 của .NET Core. Nếu đúng như vậy, bạn sẽ chỉ nhận được phiên bản xuất hiện đầu tiên trong biến môi trường PATH. Điều đó đặc biệt quan trọng nếu bạn cần cập nhật và muốn biết từng phiên bản. Để truy vấn cả hai phiên bản, hãy sử dụng:
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
Trong ví dụ trên, cả hai đều giống nhau, nhưng nếu bạn quên cập nhật cả hai trường hợp, bạn có thể nhận được các kết quả khác nhau! Lưu ý rằng đó Program Fileslà dành cho phiên bản 64 bit và Program Files (x86)là phiên bản 32 bit .
Cập nhật: Nếu bạn muốn giữ các số bản dựng trong một danh sách hơn là trong một loạt các câu lệnh if (như Microsoft đề xuất), thì bạn có thể sử dụng mã này để CheckFor45PlusVersionthay thế:
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()có lẽ chỉ cần trả về phiên bản của CLR.