如何:判斷安裝的 .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 小於 42000 的 xxxxx 支援 .NET Framework 版本4到4.5.2。 大於或等於4.0.30319.42000 版的 CLR 版本支援從 .NET Framework 4.6 開始的 .NET Framework 版本。

有 Community 維護的工具可協助偵測已安裝的 .NET Framework 版本:

如需有關針對每個 .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 的登錄中。 如果遺失 完整 子機碼,則不會安裝 .NET Framework 4.5 或更新版本。

注意

登錄路徑中的 NET Framework Setup 子機碼開頭 是句點。

登錄中的 版本 REG_DWORD 值 代表安裝的 .NET Framework 版本。

.NET Framework 版本 發行 的值
.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 的所有 Windows 作業系統上,1803版:461814
.NET Framework 4.8 在 Windows 10 2019 年5月更新和 Windows 10 2019 年11月更新:528040
Windows 10 2020 年5月更新和 Windows 10 2020 update 和 Windows 10 2021 update:528372
在 Windows 11 和 Windows Server 2022:528449
在所有其他 Windows 作業系統上 (包括其他 Windows 10 作業系統) :528049

最小版本

若要判斷 .NET Framework 的 最小 版本是否存在,請檢查是否有大於或等於下表所列對應值的 發行 REG_DWORD 值。 例如,如果您的應用程式在 .NET Framework 4.8 或更新版本下執行,請測試 大於或等於 528040 的 發行 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

使用登錄編輯程式

  1. 從 [開始] 功能表上,選擇 [執行],輸入 regedit,然後選取 [確定]。

    (您必須擁有系統管理認證才能執行 regedit。 )

  2. 在 [登錄編輯程式] 中,開啟下列子機碼: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Full。 如果 完整 的子機碼不存在,您就不會安裝 .NET Framework 4.5 或更新版本。

  3. 檢查名為 Release 的 REG_DWORD 專案。 如果存在,表示您已安裝 .NET Framework 4.5 或更新版本。 其值會對應至特定版本的 .NET Framework。 例如,在下圖中,發行 專案的值是528040,也就是 .NET Framework 4.8 的發行金鑰。

    .NET Framework 4.5 的登錄專案

<a name="use-powershell-to-check-for-a-minimum-version">使用 PowerShell 檢查最低版本

使用 PowerShell 命令來檢查 HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ NET Framework Setup \ NDP \ V4 \ Full 子機碼的 發行 專案值。

下列範例會檢查 發行 專案的值,以判斷是否已安裝 .NET Framework 4.6.2 或更新版本。 如已安裝,則此程式碼會傳回 True;否則傳回 False

(Get-ItemProperty &quot;HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full").Release -ge 394802

使用程式碼查詢登錄

  1. 使用 RegistryKey.OpenBaseKeyRegistryKey.OpenSubKey 方法來存取 Windows 登錄中的 HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Full 子機碼。

    重要

    如果您正在執行的應用程式是32位並在64位 Windows 中執行,則登錄路徑會與先前所列的不同。 您可以在 HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ 子機碼中找到64位登錄。 例如,.NET Framework 4.5 的登錄子機碼是 HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Full

  2. 檢查 發行 REG_DWORD 值,以判斷已安裝的版本。 若要正向相容,請檢查是否有大於或等於 .NET Framework 版本表中所列值的值。

下列範例會檢查登錄中 發行 專案的值,以尋找已安裝 .NET Framework 4.5-4.8 版。

提示

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 >= 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";
    // 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 >= 528040 Then
        Return "4.8 or later"
    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

此範例遵循版本檢查的建議做法:

  • 它會檢查 Release 項目值是否「大於或等於」已知版本機碼的值。
  • 它會從最新版本依序檢查到最舊版本。

偵測 .NET Framework 1.0 至4。0

從1.1 到 4.0 .NET Framework 的每個版本都會在 HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ .net Framework 安裝 \ NDP 中列為子機碼。 下表列出每個 .NET Framework 版本的路徑。 大部分的版本都有 安裝 REG_DWORD 值,表示已 1 安裝此版本。 在這些子機碼中,也有包含版本字串的 REG_SZ 值 版本

注意

登錄路徑中的 NET Framework Setup 子機碼開頭 是句點。

Framework 版本 登錄子機碼
1.0 HKLM \ Software \ Microsoft \ 。.Netframework \ 原則 \ 1.0 版 \ 3705 安裝 REG_SZ equals 1
1.1 HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v 1.1.4322 安裝 REG_DWORD equals 1
2.0 HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v 2.0.50727 安裝 REG_DWORD equals 1
3.0 HKLM \ Software \ Microsoft \ NET Framework setup \ NDP \ v3.0 \ 設定 InstallSuccess REG_DWORD equals 1
3.5 HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v 3。5 安裝 REG_DWORD equals 1
4.0 用戶端設定檔 HKLM \ Software \ Microsoft \ NET Framework 設定 \ NDP \ v4 \ 用戶端 安裝 REG_DWORD equals 1
4.0 完整設定檔 HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Full 安裝 REG_DWORD equals 1

重要

如果您正在執行的應用程式是32位並在64位 Windows 中執行,則登錄路徑會與先前所列的不同。 您可以在 HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ 子機碼中找到64位登錄。 例如,.NET Framework 3.5 的登錄子機碼是 HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ NET Framework Setup \ NDP \ v 3.5

請注意,.NET Framework 1.0 子機碼的登錄路徑與其他子機碼不同。

使用 (舊版 framework 的登錄編輯程式)

  1. 從 [開始] 功能表上,選擇 [執行],輸入 regedit,然後選取 [確定]。

    您必須具有系統管理認證才能執行 regedit。

  2. 開啟符合您要檢查之版本的子機碼。 使用「偵測.NET Framework 1.0 至 4.0 」一節中的表格。

    下圖顯示 .NET Framework 3.5 的子機碼及其 版本 值。

    .NET Framework 3.5 的登錄專案。

使用 (舊版 framework 的程式碼查詢登錄)

使用 Microsoft.Win32.RegistryKey 類別來存取 Windows 登錄中的 HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ .net Framework 安裝 \ NDP 子機碼。

重要

如果您正在執行的應用程式是32位並在64位 Windows 中執行,則登錄路徑會與先前所列的不同。 您可以在 HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ 子機碼中找到64位登錄。 例如,.NET Framework 3.5 的登錄子機碼是 HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ NET Framework Setup \ NDP \ v 3.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

尋找 CLR 版本

隨 .NET Framework 安裝的 .NET Framework CLR 會分開建立版本。 有兩種方式可以偵測 .NET Framework CLR 的版本:

  • Clrver.exe 工具

    使用 Clr 版本工具 (Clrver.exe) 來判斷電腦上安裝的 clr 版本。 開啟Visual Studio 開發人員命令提示字元或 Visual Studio 開發人員 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 和更新版本中所述。

    1. 查詢 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 版。

    2. 取得 版本 物件之後,請依照下列方式進行查詢:

      • 針對主要版本識別項 (例如 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
    

另請參閱