使用者可以 在其 電腦上安裝和執行多個版本的.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 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 版本

    (您必須具有系統管理認證才能執行 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.OpenBaseKeyRegistryKey.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.Win32Imports 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"))}"); 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"))}") 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 資料夾開頭不是英文句號。

    HKLM\Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup InstallSuccess REG_DWORD 等於 1 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}"); 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}"); 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}") 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}") Console.WriteLine($" {subKeyName} {name}") End If End If End If End Using

    範例會顯示類似下面的輸出:

    v2.0.50727  2.0.50727.4927  SP2
    v3.0  3.0.30729.4926  SP2
    v3.5  3.5.30729.4926  SP1
      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
    
  • 如何:判斷已安裝哪些.NET Framework更新
  • 疑難排解:判斷已安裝哪些版本的 .NET Framework Service Pack
  • 為開發人員安裝.NET Framework
  • .NET Framework 版本和相依性
  •