如何:判斷安裝的 .NET Framework 版本
使用者可以在其電腦上安裝和執行多個版本的.NET Framework。 當您開發或部署應用程式時,您可能需要知道使用者電腦上已安裝哪些.NET Framework版本。 登錄包含電腦上安裝.NET Framework版本的清單。
注意
本文專屬於.NET Framework。 若要判斷已安裝哪些 .NET Core 和 .NET 5+ SDK 和執行時間,請參閱 如何檢查是否已安裝 .NET。
.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 版。 CLR 版本大於或等於 4.0.30319.42000 支援從 .NET Framework 4.6 開始的.NET Framework版本。
社群維護的工具可用來協助偵測已安裝哪些.NET Framework版本:
https://github.com/jmalarcon/DotNetVersions
.NET Framework 2.0 命令列工具。
https://github.com/EliteLoser/DotNetVersionLister
PowerShell 2.0 模組。
如需偵測每個版本.NET Framework已安裝更新的資訊,請參閱如何:判斷已安裝哪些.NET Framework更新。
判斷應用程式執行所在的 .NET 實作和版本
您可以使用 RuntimeInformation.FrameworkDescription 屬性來查詢應用程式執行所在的 .NET 實作和版本。 如果應用程式在.NET Framework上執行,輸出會類似:
.NET Framework 4.8.4250.0
相較之下,如果應用程式在 .NET Core 或 .NET 5+ 上執行,輸出會類似:
.NET Core 3.1.9
.NET 5.0.0
偵測 .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 更新上: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。 如果[完整]子機碼不存在,則您尚未安裝 .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 中執行,則登錄路徑會與先前列出的路徑不同。 64 位元登錄可在 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 中執行,則登錄路徑會與先前列出的路徑不同。 64 位元登錄可在 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。
開啟符合您要檢查的版本的子機碼。 使用Detect .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 中執行,則登錄路徑會與先前列出的路徑不同。 64 位元登錄可在 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
類別重要
對於 .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