Dulu mudah, tetapi Microsoft memutuskan untuk membuat perubahan besar: Sebelum versi 4.5, setiap versi .NET berada di direktori sendiri di bawah ini C:\Windows\Microsoft.NET\Framework(subdirektori v1.0.3705, v1.1.4322, v2.0.50727, v3.0, v3.5dan v4.0.30319).
Sejak versi 4.5 ini telah diubah: Setiap versi .NET (yaitu 4.5.x, 4.6.x, 4.7.x, 4.8.x, ...) sedang diinstal di subdirektori yang sama v4.0.30319- jadi Anda tidak dapat lagi periksa versi .NET yang diinstal dengan melihat ke Microsoft.NET\Framework.
Untuk memeriksa versi .NET, Microsoft telah menyediakan dua contoh skrip yang berbeda tergantung pada versi .NET yang sedang diperiksa, tetapi saya tidak suka memiliki dua skrip C # yang berbeda untuk ini. Jadi saya mencoba menggabungkannya menjadi satu, berikut skrip yang GetDotNetVersion.cssaya buat (dan memperbaruinya untuk framework 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;
}
}
Di mesin saya itu menghasilkan:
v2.0.50727 2.0.50727.4927 SP2
v3.0 3.0.30729.4926 SP2
v3.5 3.5.30729.4926 SP1
v4
Klien 4.7.03056
Penuh 4.7.03056
v4.0
Klien 4.0.0.0
.NET Framework Versi: 4.7.2 atau yang lebih baru
*** * Nomor versi .NET maksimum yang ditemukan adalah: 4.7.2 atau yang lebih baru ****
Satu-satunya hal yang perlu dipertahankan dari waktu ke waktu adalah nomor build setelah versi .NET lebih besar dari 4.7.1 keluar - itu dapat dilakukan dengan mudah dengan memodifikasi fungsi CheckFor45PlusVersion, Anda perlu mengetahui kunci rilis untuk versi baru, lalu Anda bisa menambahkannya. Sebagai contoh:
if (releaseKey >= 461308) return "4.7.1 or later";
Kunci rilis ini masih yang terbaru dan berlaku untuk update Kejatuhan Kreator Windows 10. Jika Anda masih menjalankan versi lainnya (yang lebih tua) Windows, ada satu lagi sebagai per ini dokumentasi dari Microsoft:
.NET Framework 4.7.1 diinstal pada semua versi OS Windows 461310
Jadi, jika Anda membutuhkannya juga, Anda harus menambahkan
if (releaseKey >= 461310) return "4.7.1 or later";
ke atas fungsi CheckFor45PlusVersion. Juga berfungsi untuk versi yang lebih baru. Misalnya, saya telah menambahkan centang untuk 4.8 baru-baru ini. Anda biasanya dapat menemukan nomor build tersebut di Microsoft.
Catatan: Anda tidak perlu menginstal Visual Studio, bahkan PowerShell - Anda dapat menggunakan csc.exeuntuk mengkompilasi dan menjalankan skrip di atas, yang telah saya jelaskan di sini.
Pembaruan: Pertanyaannya adalah tentang .NET Framework, demi kelengkapan, saya ingin menyebutkan cara menanyakan versi .NET Core juga - dibandingkan dengan yang di atas, itu mudah: Buka shell perintah dan ketik:
dotnet --info Enter
dan itu akan mencantumkan nomor versi .NET Core, versi Windows dan versi dari setiap DLL runtime terkait juga. Output sampel:
.NET Core SDK (mencerminkan global.json apa pun):
Versi: 2.1.300
Komit: adab45bf0c
Lingkungan Waktu Proses
:
Nama
OS: Versi OS Windows
: 10.0.15063
Platform OS: Windows
RID: win10-x64
Jalur Dasar: C: \ Program Files \ dotnet \ sdk \ 2.1.300
Host (berguna untuk dukungan):
Versi: 2.1.0
Commit: caa7b7e2ba
.NET Core SDKs diinstal:
1.1.9 [C: \ Program Files \ dotnet \ sdk]
2.1.102 [C: \ Program Files \ dotnet \ sdk]
...
2.1.300 [C: \ Program Files \ dotnet \ sdk]
Microsoft.NETCore.App 2.1.0 [C: \ Program Files \ dotnet \ shared \ Microsoft.NETCore.App]
Ke instal runtime atau SDK .NET Core tambahan:
.NET Core runtimes diinstal:
Microsoft.AspNetCore.All 2.1.0 [C: \ Program
Files \ dotnet \ shared \ Microsoft .AspNetCore.All]
...
https://aka.ms/dotnet-download
Catat itu
jika Anda hanya membutuhkan nomor versi tanpa semua informasi tambahan, Anda dapat menggunakan
dotnet --version.
pada PC Windows 64 bit , dimungkinkan untuk menginstal versi x86 berdampingan dengan versi x64 dari .NET Core. Jika demikian, Anda hanya akan mendapatkan versi yang lebih dulu dalam variabel lingkungan PATH. Itu sangat penting jika Anda perlu terus memperbaruinya dan ingin mengetahui setiap versi. Untuk menanyakan kedua versi, gunakan:
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
Pada contoh di atas, keduanya sama, tetapi jika Anda lupa memperbarui kedua contoh, Anda mungkin mendapatkan hasil yang berbeda! Perhatikan itu Program Filesuntuk versi 64bit , dan Program Files (x86)merupakan versi 32bit .
Pembaruan: Jika Anda lebih suka menyimpan nomor build dalam daftar daripada dalam rangkaian pernyataan if (seperti yang disarankan Microsoft), Anda dapat menggunakan kode ini untuk 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()mungkin hanya mengembalikan versi CLR.