訓練
如何:判斷安裝的 .NET Framework 版本
注意
本文專屬於 .NET Framework。 若要判斷已安裝哪些 .Net Core 和 .NET 5+ SDK 和執行階段,請參閱如何檢查 .NET 是否已安裝。
您可以在電腦上安裝並執行多個版本的 .NET Framework。
- 如果您想要在自己的電腦上檢查版本,最簡單的方式是透過 [控制台]>[程式集]>[程式和功能],或在 [設定] 中的 [應用程式]>[已安裝的應用程式]。 您也可以使用這些社群維護的工具。
- 如果您是應用程式開發人員,您可能需要知道應用程式使用者的電腦上安裝了哪些 .NET Framework 版本。 登錄包含電腦上安裝的 .NET Framework 版本清單。 您也可以查詢
RuntimeInformation.FrameworkDescription
屬性。 - 若要尋找個別設定版本的 CLR 版本,請參閱尋找 CLR 版本。
.NET Framework 包含兩個主要元件,各有各的版本控制:
- 組件集合,這是為應用程式提供功能的類型與資源集合。 .NET Framework 和組件會共用相同的版本號碼。 例如,.NET Framework 版本包含 4.5、4.6.1 和 4.7.2。
- 通用語言執行平台 (CLR),負責管理和執行應用程式的程式碼。 單一的 CLR 版本通常會支援多個 .NET Framework 版本。 例如,CLR 版本 4.0.30319.xxxxx,其中 xxxxx 小於 42000,支援 .NET Framework 版本 4 到 4.5.2。 大於或等於 4.0.30319.42000 的 CLR 版本支援從 .NET Framework 4.6 開始 .NET 的 Framework 版本。
提示
如需偵測每一版 .NET Framework 已安裝之更新的資訊,請參閱如何:判斷安裝的 .NET Framework 更新。
社群維護的工具可用來協助偵測已安裝的 .NET Framework 版本:
若要以程式設計方式查詢您的應用程式正在執行的 .NET 版本,您可以使用 RuntimeInformation.FrameworkDescription 屬性。 如果應用程式在 .NET Framework 上執行,輸出會類似:
.NET Framework 4.8.4250.0
相較之下,如果應用程式在 .NET Core 或 .NET 5+ 上執行,輸出會類似:
.NET Core 3.1.9
.NET 5.0.0
您可以使用登錄來偵測已安裝哪些 .NET Framework 版本。 .NET Framework 1.0-4.0 和 .NET Framework 4.5+ 的機碼不同。 您可以使用登錄編輯器、PowerShell 或程式碼來檢查登錄。
安裝在機器上的 .NET Framework (4.5和更新版本) 會列在登錄中:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full。 如果遺漏 Full 子機碼,則不會安裝 .NET Framework 4.5 或更新版本。
注意
登錄中的 NET Framework Setup 資料夾開頭不是英文句號。
登錄中的 Release REG_DWORD 值代表已安裝的 .NET Framework 版本。
.NET Framework 版本 | Release 的值 |
---|---|
.NET Framework 4.5 | 所有 Windows 作業系統:378389 |
.NET Framework 4.5.1 | Windows 8.1 和 Windows Server 2012 R2 上:378675 其他所有 Windows 作業系統上:378758 |
.NET Framework 4.5.2 | 所有 Windows 作業系統:379893 |
.NET Framework 4.6 | 在 Windows 10 上:393295 其他所有 Windows 作業系統上:393297 |
.NET Framework 4.6.1 | Windows 10 11 月更新系統上:394254 其他所有 Windows 作業系統 (包括 Windows 10) 上:394271 |
.NET Framework 4.6.2 | Windows 10 年度更新版及 Windows Server 2016:394802 其他所有 Windows 作業系統 (包括其他 Windows 10 作業系統) 上:394806 |
.NET Framework 4.7 | Windows 10 Creators Update 上:460798 其他所有 Windows 作業系統 (包括其他 Windows 10 作業系統) 上:460805 |
.NET Framework 4.7.1 | Windows 10 Fall Creators Update 和 Windows Server 版本 1709 上:461308 其他所有 Windows 作業系統 (包括其他 Windows 10 作業系統) 上:461310 |
.NET Framework 4.7.2 | Windows 10 2018 年 4 月更新和 Windows Server 版本 1803 上:461808 Windows 10 2018 年 4 月更新及 Windows Server 版本 1803 以外的所有作業系統版本上:461814 |
.NET Framework 4.8 | Windows 10 2019 年 5 月更新和 Windows 10 2019 年 11 月更新上:528040 Windows 10 2020 年 5 月更新、2020 年 10 月更新、2021 年 5 月更新、2021 年 11 月更新和 2022 更新上:528372 Windows 11 和 Windows Server 2022 上:528449 其他所有 Windows 作業系統 (包括其他 Windows 10 作業系統) 上:528049 |
.NET Framework 4.8.1 | Windows 11 2022 年更新和 Windows 11 2023 年更新上:533320 所有其他 Windows 作業系統上:533325 |
若要判斷 .NET Framework 的最低版本是否存在,請檢查 Release REG_DWORD 值是否大於或等於下表所列的對應值。 例如,如果您的應用程式是執行 .NET Framework 4.8 或更新版本,請測試大於或等於 528040 的 Release REG_DWORD 值。
.NET Framework 版本 | 最小值 |
---|---|
.NET Framework 4.5 | 378389 |
.NET Framework 4.5.1 | 378675 |
.NET Framework 4.5.2 | 379893 |
.NET Framework 4.6 | 393295 |
.NET Framework 4.6.1 | 394254 |
.NET Framework 4.6.2 | 394802 |
.NET Framework 4.7 | 460798 |
.NET Framework 4.7.1 | 461308 |
.NET Framework 4.7.2 | 461808 |
.NET Framework 4.8 | 528040 |
.NET Framework 4.8.1 | 533320 |
從 [開始] 功能表上,選擇 [執行],輸入 regedit,然後選取 [確定]。
(您必須具有系統管理認證才能執行 regedit。)
在登錄編輯程式中,開啟下列子機碼:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full。 如果 Full 子機碼不存在,即表示未安裝 .NET Framework 4.5 或更新版本。
檢查是否有名為 Release 的 REG_DWORD 項目。 如果存在,則您已安裝 .NET Framework 4.5 或更新版本。 其值會對應至特定版本的 .NET Framework。 例如,下圖中 Release 項目的值是 528040,也就是 .NET Framework 4.8 的版本機碼。
使用 PowerShell 命令檢查 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full 子機碼的 Release 項目值。
下列範例會檢查 Release 項目值,以判斷是否安裝了 .NET Framework 4.6.2 或更新版本。 如已安裝,則此程式碼會傳回 True
;否則傳回 False
。
(Get-ItemPropertyValue -LiteralPath 'HKLM:SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full' -Name Release) -ge 394802
使用 RegistryKey.OpenBaseKey 和 RegistryKey.OpenSubKey 方法存取 Windows 登錄中的 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full 子機碼。
重要
如果您執行的應用程式是 32 位元且在 64 位元 Windows 中執行,則登錄路徑會與先前列出的路徑不同。 32 位元登錄位於 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ 子機碼中。 例如,.NET Framework 4.5 的登錄子機碼為 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\NET Framework Setup\NDP\v4\Full。
檢查 Release REG_DWORD 項目的值,判斷已安裝的版本。 若要正向相容,請檢查是否有大於或等於 .NET Framework 版本表中所列值的值。
下列範例會檢查登錄中的 Release 項目值,尋找已安裝的 .NET Framework 4.5-4.8.1 版本。
提示
如果您尚未這麼做,請在程式碼檔案頂端新增指示詞 using Microsoft.Win32
或 Imports Microsoft.Win32
。
const string subkey = @"SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full\";
using (var ndpKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).OpenSubKey(subkey))
{
if (ndpKey != null && ndpKey.GetValue("Release") != null)
{
Console.WriteLine($".NET Framework Version: {CheckFor45PlusVersion((int)ndpKey.GetValue("Release"))}");
}
else
{
Console.WriteLine(".NET Framework Version 4.5 or later is not detected.");
}
}
// Checking the version using >= enables forward compatibility.
string CheckFor45PlusVersion(int releaseKey)
{
if (releaseKey >= 533320)
return "4.8.1 or later";
if (releaseKey >= 528040)
return "4.8";
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";
// This code should never execute. A non-null release key should mean
// that 4.5 or later is installed.
return "No 4.5 or later version detected";
}
Private Sub Get45PlusFromRegistry()
Const subkey As String = "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full\"
Using ndpKey As RegistryKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).OpenSubKey(subkey)
If ndpKey IsNot Nothing AndAlso ndpKey.GetValue("Release") IsNot Nothing Then
Console.WriteLine($".NET Framework Version: {CheckFor45PlusVersion(ndpKey.GetValue("Release"))}")
Else
Console.WriteLine(".NET Framework Version 4.5 or later is not detected.")
End If
End Using
End Sub
' Checking the version using >= enables forward compatibility.
Private Function CheckFor45PlusVersion(releaseKey As Integer) As String
If releaseKey >= 533320 Then
Return "4.8.1 or later"
ElseIf releaseKey >= 528040 Then
Return "4.8"
ElseIf releaseKey >= 461808 Then
Return "4.7.2"
ElseIf releaseKey >= 461308 Then
Return "4.7.1"
ElseIf releaseKey >= 460798 Then
Return "4.7"
ElseIf releaseKey >= 394802 Then
Return "4.6.2"
ElseIf releaseKey >= 394254 Then
Return "4.6.1"
ElseIf releaseKey >= 393295 Then
Return "4.6"
ElseIf releaseKey >= 379893 Then
Return "4.5.2"
ElseIf releaseKey >= 378675 Then
Return "4.5.1"
ElseIf releaseKey >= 378389 Then
Return "4.5"
End If
' This code should never execute. A non-null release key should mean
' that 4.5 or later is installed.
Return "No 4.5 or later version detected"
End Function
範例會顯示如下的輸出:
.NET Framework Version: 4.6.1
下列範例會使用 PowerShell 來檢查登錄中的 Release 項目值,尋找已安裝的 .NET Framework 4.5-4.8.1 版本:
$release = Get-ItemPropertyValue -LiteralPath 'HKLM:SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full' -Name Release
switch ($release) {
{ $_ -ge 533320 } { $version = '4.8.1 or later'; break }
{ $_ -ge 528040 } { $version = '4.8'; break }
{ $_ -ge 461808 } { $version = '4.7.2'; break }
{ $_ -ge 461308 } { $version = '4.7.1'; break }
{ $_ -ge 460798 } { $version = '4.7'; break }
{ $_ -ge 394802 } { $version = '4.6.2'; break }
{ $_ -ge 394254 } { $version = '4.6.1'; break }
{ $_ -ge 393295 } { $version = '4.6'; break }
{ $_ -ge 379893 } { $version = '4.5.2'; break }
{ $_ -ge 378675 } { $version = '4.5.1'; break }
{ $_ -ge 378389 } { $version = '4.5'; break }
default { $version = $null; break }
}
if ($version) {
Write-Host -Object ".NET Framework Version: $version"
} else {
Write-Host -Object '.NET Framework Version 4.5 or later is not detected.'
}
此範例遵循版本檢查的建議做法:
- 它會檢查 Release 專案的值是否大於或等於已知發行值的值。
- 它會從最新版本依序檢查到最舊版本。
從 1.1 到 4.0 的每個 .NET Framework 版本都會列為 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP 的子機碼。 下表列出每個 .NET Framework 版本的路徑。 對於大部分版本,會有 Install REG_DWORD 值 1
,指出已安裝此版本。 在這些子機碼中,也有包含版本字串的 Version REG_SZ 值。
注意
登錄中的 NET Framework Setup 資料夾開頭不是英文句號。
Framework 版本 | 登錄子機碼 | 值 |
---|---|---|
1.0 | HKLM\Software\Microsoft\.NETFramework\Policy\v1.0\3705 | Install REG_SZ 等於 1 |
1.1 | HKLM\Software\Microsoft\NET Framework Setup\NDP\v1.1.4322 | Install REG_DWORD 等於 1 |
2.0 | HKLM\Software\Microsoft\NET Framework Setup\NDP\v2.0.50727 | Install REG_DWORD 等於 1 |
3.0 | HKLM\Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup | InstallSuccess REG_DWORD 等於 1 |
3.5 | HKLM\Software\Microsoft\NET Framework Setup\NDP\v3.5 | Install REG_DWORD 等於 1 |
4.0 用戶端設定檔 | HKLM\Software\Microsoft\NET Framework Setup\NDP\v4\Client | Install REG_DWORD 等於 1 |
4.0 完整設定檔 | HKLM\Software\Microsoft\NET Framework Setup\NDP\v4\Full | Install REG_DWORD 等於 1 |
重要
如果您執行的應用程式是 32 位元且在 64 位元 Windows 中執行,則登錄路徑會與先前列出的路徑不同。 32 位元登錄位於 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ 子機碼中。 例如,.NET Framework 3.5 的登錄子機碼為 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\NET Framework Setup\NDP\v3.5。
請注意,.NET Framework 1.0 子機碼的登錄路徑與其他子機碼不同。
從 [開始] 功能表上,選擇 [執行],輸入 regedit,然後選取 [確定]。
您必須具有系統管理認證才能執行 regedit。
開啟符合您要檢查的版本的子機碼。 使用 .NET Framework 1.0-4.0 區段中的資料表。
下圖顯示 .NET Framework 3.5 的子機碼及其 Version 值。
使用 Microsoft.Win32.RegistryKey 類別存取 Windows 登錄中的 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP 子機碼。
重要
如果您執行的應用程式是 32 位元且在 64 位元 Windows 中執行,則登錄路徑會與先前列出的路徑不同。 32 位元登錄位於 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ 子機碼中。 例如,.NET Framework 3.5 的登錄子機碼為 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\NET Framework Setup\NDP\v3.5。
下列範例會尋找已安裝的 .NET Framework 1-4 版本:
// Open the registry key for the .NET Framework entry.
using (RegistryKey ndpKey =
RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).
OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP\"))
{
foreach (var versionKeyName in ndpKey.GetSubKeyNames())
{
// Skip .NET Framework 4.5 version information.
if (versionKeyName == "v4")
{
continue;
}
if (versionKeyName.StartsWith("v"))
{
RegistryKey versionKey = ndpKey.OpenSubKey(versionKeyName);
// Get the .NET Framework version value.
var name = (string)versionKey.GetValue("Version", "");
// Get the service pack (SP) number.
var sp = versionKey.GetValue("SP", "").ToString();
// Get the installation flag.
var install = versionKey.GetValue("Install", "").ToString();
if (string.IsNullOrEmpty(install))
{
// No install info; it must be in a child subkey.
Console.WriteLine($"{versionKeyName} {name}");
}
else if (install == "1")
{
// Install = 1 means the version is installed.
if (!string.IsNullOrEmpty(sp))
{
Console.WriteLine($"{versionKeyName} {name} SP{sp}");
}
else
{
Console.WriteLine($"{versionKeyName} {name}");
}
}
if (!string.IsNullOrEmpty(name))
{
continue;
}
// else print out info from subkeys...
// Iterate through the subkeys of the version subkey.
foreach (var subKeyName in versionKey.GetSubKeyNames())
{
RegistryKey subKey = versionKey.OpenSubKey(subKeyName);
name = (string)subKey.GetValue("Version", "");
if (!string.IsNullOrEmpty(name))
sp = subKey.GetValue("SP", "").ToString();
install = subKey.GetValue("Install", "").ToString();
if (string.IsNullOrEmpty(install))
{
// No install info; it must be later.
Console.WriteLine($" {versionKeyName} {name}");
}
else if (install == "1")
{
if (!string.IsNullOrEmpty(sp))
{
Console.WriteLine($" {subKeyName} {name} SP{sp}");
}
else
{
Console.WriteLine($" {subKeyName} {name}");
}
}
}
}
}
}
' Opens the registry key for the .NET Framework entry.
Using ndpKey As RegistryKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).
OpenSubKey("SOFTWARE\Microsoft\NET Framework Setup\NDP\")
For Each versionKeyName In ndpKey.GetSubKeyNames()
' Skip .NET Framework 4.5 and later.
If versionKeyName = "v4" Then Continue For
If versionKeyName.StartsWith("v") Then
Dim versionKey As RegistryKey = ndpKey.OpenSubKey(versionKeyName)
' Get the .NET Framework version value.
Dim name = DirectCast(versionKey.GetValue("Version", ""), String)
' Get the service pack (SP) number.
Dim sp = versionKey.GetValue("SP", "").ToString()
Dim install = versionKey.GetValue("Install", "").ToString()
If String.IsNullOrEmpty(install) Then
' No install info; it must be in a child subkey.
Console.WriteLine($"{versionKeyName} {name}")
ElseIf install = "1" Then
If Not String.IsNullOrEmpty(sp) Then
Console.WriteLine($"{versionKeyName} {name} SP{sp}")
Else
Console.WriteLine($"{versionKeyName} {name}")
End If
End If
If Not String.IsNullOrEmpty(name) Then
Continue For
End If
For Each subKeyName In versionKey.GetSubKeyNames()
Dim subKey As RegistryKey = versionKey.OpenSubKey(subKeyName)
name = DirectCast(subKey.GetValue("Version", ""), String)
If Not String.IsNullOrEmpty(name) Then
sp = subKey.GetValue("SP", "").ToString()
End If
install = subKey.GetValue("Install", "").ToString()
If String.IsNullOrEmpty(install) Then
' No install info; it must be later.
Console.WriteLine($" {versionKeyName} {name}")
ElseIf install = "1" Then
If Not String.IsNullOrEmpty(sp) Then
Console.WriteLine($" {subKeyName} {name} SP{sp}")
Else
Console.WriteLine($" {subKeyName} {name}")
End If
End If
Next
End If
Next
End Using
範例會顯示類似下面的輸出:
v2.0.50727 2.0.50727.4927 SP2
v3.0 3.0.30729.4926 SP2
v3.5 3.5.30729.4926 SP1
v4.0
Client 4.0.0.0
下列範例會使用 PowerShell 來檢查登錄中的 Release 項目值,尋找已安裝的 .NET Framework 1-4 版本:
Get-ChildItem -Path 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' |
Where-Object { ($_.PSChildName -ne "v4") -and ($_.PSChildName -like 'v*') } |
ForEach-Object {
$name = $_.Version
$sp = $_.SP
$install = $_.Install
if (-not $install) {
Write-Host -Object "$($_.PSChildName) $($name)"
}
elseif ($install -eq '1') {
if (-not $sp) {
Write-Host -Object "$($_.PSChildName) $($name)"
}
else {
Write-Host -Object "$($_.PSChildName) $($name) SP$($sp)"
}
}
if (-not $name) {
$parentName = $_.PSChildName
Get-ChildItem -LiteralPath $_.PSPath |
Where-Object {
if ($_.Property -contains 'Version') { $name = Get-ItemPropertyValue -Path $_.PSPath -Name Version }
if ($name -and ($_.Property -contains 'SP')) { $sp = Get-ItemPropertyValue -Path $_.PSPath -Name SP }
if ($_.Property -contains 'Install') { $install = Get-ItemPropertyValue -Path $_.PSPath -Name Install }
if (-not $install) {
Write-Host -Object " $($parentName) $($name)"
}
elseif ($install -eq '1') {
if (-not $sp) {
Write-Host -Object " $($_.PSChildName) $($name)"
}
else {
Write-Host -Object " $($_.PSChildName) $($name) SP$($sp)"
}
}
}
}
}
隨 .NET Framework 一起安裝的 .NET Framework CLR 會個別設定版本。 有兩種方式可以偵測 .NET Framework CLR 的版本:
使用 CLR 版本工具 (Clrver.exe) 以判斷電腦上安裝了哪些 CLR 版本。 開啟 Visual Studio 開發人員命令提示字元或 Visual Studio Developer PowerShell,然後輸入 clrver
。
範例輸出:
Versions installed on the machine:
v2.0.50727
v4.0.30319
重要
針對 .NET Framework 4.5 和更新版本,請不要使用 Environment.Version 屬性偵測 CLR 的版本。 請改為查詢登錄,如 .NET Framework 4.5 和更新版本中所述。
查詢 Environment.Version 屬性以擷取 Version 物件。
傳回的
System.Version
物件可識別目前執行程式碼的執行階段版本。 它不會傳回組件版本或已安裝在電腦上的其他執行階段版本。針對 .NET Framework 4、4.5、4.5.1 和 4.5.2 版,所傳回 Version 物件的字串表示格式為 4.0.30319.xxxxx,其中 xxxxx 會小於 42000。 針對 .NET Framework 4.6 和更新版本,其格式為 4.0.30319.42000。
取得 Version 物件之後,如下所示來加以查詢:
- 針對主要版本識別項 (例如 4.0 版的 4),請使用 Version.Major 屬性。
- 針對次要版本識別項 (例如 4.0 版的 0),請使用 Version.Minor 屬性。
- 針對整個版本字串 (例如 4.0.30319.18010),請使用 Version.ToString 方法。 這個方法會傳回單一值,其反映執行程式碼的執行階段版本。 它不會傳回組件版本或可能已安裝在電腦上的其他執行階段版本。
下列範例使用 Environment.Version 屬性來擷取 CLR 版本資訊:
Console.WriteLine($"Version: {Environment.Version}");
Console.WriteLine($"Version: {Environment.Version}")
範例會顯示類似下面的輸出:
Version: 4.0.30319.18010