如何:判斷安裝的 .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 版本:
RuntimeInformation.FrameworkDescription
屬性
若要以程式設計方式查詢您的應用程式正在執行的 .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 和更新版本
安裝在機器上的 .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 來檢查最低版本
使用 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 查詢登錄
下列範例會使用 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 專案的值是否大於或等於已知發行值的值。
- 它會從最新版本依序檢查到最舊版本。
.NET Framework 1.0-4.0
從 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 子機碼的登錄路徑與其他子機碼不同。
使用登錄編輯器 (舊版 Framework)
從 [開始] 功能表上,選擇 [執行],輸入 regedit,然後選取 [確定]。
您必須具有系統管理認證才能執行 regedit。
開啟符合您要檢查的版本的子機碼。 使用 .NET Framework 1.0-4.0 區段中的資料表。
下圖顯示 .NET Framework 3.5 的子機碼及其 Version 值。
使用程式碼查詢登錄 (舊版 Framework)
使用 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 查詢登錄 (舊版 Framework)
下列範例會使用 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)"
}
}
}
}
}
尋找 CLR 版本
隨 .NET Framework 一起安裝的 .NET Framework CLR 會個別設定版本。 有兩種方式可以偵測 .NET Framework CLR 的版本:
Clrver.exe 工具
使用 CLR 版本工具 (Clrver.exe) 以判斷電腦上安裝了哪些 CLR 版本。 開啟 Visual Studio 開發人員命令提示字元或 Visual Studio Developer PowerShell,然後輸入 clrver
。
範例輸出:
Versions installed on the machine:
v2.0.50727
v4.0.30319
Environment.Version
屬性
重要
針對 .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