如何檢測安裝了哪些.NET Framework版本和Service Pack?


在這裡提出一個類似的問題,但它是特定於.NET 3.5的。 具體來說,我正在尋找以下內容:

  1. 什麼是確定安裝哪些.NET Framework版本和Service Pack的正確方法?
  2. 是否有一個可以使用的註冊表項列表?
  3. 框架版本之間是否存在任何依賴關係?


Answers


註冊表是檢測是否安裝了特定版本的框架的官方方式

需要哪些註冊表項更改取決於您正在尋找的框架版本:

Framework Version  Registry Key
------------------------------------------------------------------------------------------
1.0                HKLM\Software\Microsoft\.NETFramework\Policy\v1.0\3705 
1.1                HKLM\Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\Install 
2.0                HKLM\Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\Install 
3.0                HKLM\Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\InstallSuccess 
3.5                HKLM\Software\Microsoft\NET Framework Setup\NDP\v3.5\Install 
4.0 Client Profile HKLM\Software\Microsoft\NET Framework Setup\NDP\v4\Client\Install
4.0 Full Profile   HKLM\Software\Microsoft\NET Framework Setup\NDP\v4\Full\Install

一般來說,你正在尋找:

"Install"=dword:00000001

除了.NET 1.0,其中值是一個字符串( REG_SZ )而不是一個數字( REG_DWORD )。

確定服務包級別遵循類似的模式:

Framework Version  Registry Key
------------------------------------------------------------------------------------------
1.0                HKLM\Software\Microsoft\Active Setup\Installed Components\{78705f0d-e8db-4b2d-8193-982bdda15ecd}\Version 
1.0[1]             HKLM\Software\Microsoft\Active Setup\Installed Components\{FDC11A6F-17D1-48f9-9EA3-9051954BAA24}\Version 
1.1                HKLM\Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\SP 
2.0                HKLM\Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\SP 
3.0                HKLM\Software\Microsoft\NET Framework Setup\NDP\v3.0\SP 
3.5                HKLM\Software\Microsoft\NET Framework Setup\NDP\v3.5\SP 
4.0 Client Profile HKLM\Software\Microsoft\NET Framework Setup\NDP\v4\Client\Servicing
4.0 Full Profile   HKLM\Software\Microsoft\NET Framework Setup\NDP\v4\Full\Servicing

[1] Windows Media Center or Windows XP Tablet Edition

如您所見,如果在Windows Media Center或Windows XP Tablet Edition上運行,則確定.NET 1.0的SP級別會發生變化。 同樣,.NET 1.0使用一個字符串值,而所有其他的使用一個DWORD。

對於.NET 1.0,這兩個鍵之一的字符串值的格式為#,#,####,#。 最後一個#是Service Pack級別。

雖然我沒有明確要求,但如果您想知道框架的確切版本號,您可以使用這些註冊表項:

Framework Version  Registry Key
------------------------------------------------------------------------------------------
1.0                HKLM\Software\Microsoft\Active Setup\Installed Components\{78705f0d-e8db-4b2d-8193-982bdda15ecd}\Version 
1.0[1]             HKLM\Software\Microsoft\Active Setup\Installed Components\{FDC11A6F-17D1-48f9-9EA3-9051954BAA24}\Version 
1.1                HKLM\Software\Microsoft\NET Framework Setup\NDP\v1.1.4322 
2.0[2]             HKLM\Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\Version 
2.0[3]             HKLM\Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\Increment
3.0                HKLM\Software\Microsoft\NET Framework Setup\NDP\v3.0\Version 
3.5                HKLM\Software\Microsoft\NET Framework Setup\NDP\v3.5\Version 
4.0 Client Profile HKLM\Software\Microsoft\NET Framework Setup\NDP\v4\Version 
4.0 Full Profile   HKLM\Software\Microsoft\NET Framework Setup\NDP\v4\Version 

[1] Windows Media Center or Windows XP Tablet Edition
[2] .NET 2.0 SP1
[3] .NET 2.0 Original Release (RTM)

同樣,.NET 1.0使用一個字符串值,而所有其他的使用一個DWORD。

補充筆記

  • 對於.NET 1.0,這兩個鍵之一的字符串值的格式為#,#,####,# 。 該字符串的#,#,####部分是Framework版本。

  • 對於.NET 1.1,我們使用註冊表項本身的名稱,它代表版本號。

  • 最後,如果您查看依賴關係,.NET 3.0為.NET 2.0添加了額外的功能,因此.NET 2.0和.NET 3.0必須同時安裝,才能正確地說.NET 3.0已經安裝。 同樣的,.NET 3.5為.NET 2.0和.NET 3.0增加了額外的功能,所以.NET 2.0,.NET 3.0和.NET 3都應該評估為安裝正確的說.NET 3.5已經安裝。

  • .NET 4.0安裝可以與CLR 2.0並行運行的新版CLR(CLR版本4.0)。

更新.NET 4.5

如果安裝了.NET 4.5,則註冊表中不會有v4.5密鑰。 相反,您必須檢查HKLM\Software\Microsoft\NET Framework Setup\NDP\v4\Full鍵是否包含一個名為Release的值。 如果存在這個值,則安裝.NET 4.5,否則不會。 更多細節可以在這里和這裡找到。







Framework 4 beta安裝到不同的註冊表項。

using System;
using System.Collections.ObjectModel;
using Microsoft.Win32;

class Program
{
    static void Main(string[] args)
    {
        foreach(Version ver in InstalledDotNetVersions())
            Console.WriteLine(ver);

        Console.ReadKey();
    }


    public static Collection<Version> InstalledDotNetVersions()
    {
        Collection<Version> versions = new Collection<Version>();
        RegistryKey NDPKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP");
        if (NDPKey != null)
        {
            string[] subkeys = NDPKey.GetSubKeyNames();
            foreach (string subkey in subkeys)
            {
                GetDotNetVersion(NDPKey.OpenSubKey(subkey), subkey, versions);
                GetDotNetVersion(NDPKey.OpenSubKey(subkey).OpenSubKey("Client"), subkey, versions);
                GetDotNetVersion(NDPKey.OpenSubKey(subkey).OpenSubKey("Full"), subkey, versions);
            }
        }
        return versions;
    }

    private static void GetDotNetVersion(RegistryKey parentKey, string subVersionName, Collection<Version> versions)
    {
        if (parentKey != null)
        {
            string installed = Convert.ToString(parentKey.GetValue("Install"));
            if (installed == "1")
            {
                string version = Convert.ToString(parentKey.GetValue("Version"));
                if (string.IsNullOrEmpty(version))
                {
                    if (subVersionName.StartsWith("v"))
                        version = subVersionName.Substring(1);
                    else
                        version = subVersionName;
                }

                Version ver = new Version(version);

                if (!versions.Contains(ver))
                    versions.Add(ver);
            }
        }
    }
}



枚舉HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP 。 每個子項都是一個.NET版本。 如果計算機上存在Install=1值,則顯示Service Pack的SP值以及使用MSI=1安裝的MSI=1值。 (Windows Vista上的.NET 2.0沒有最後一個例子,因為它是操作系統的一部分。)




我想檢測我的系統上是否安裝了.NET 4.5.2版本,並且找不到比ASoft .NET版本檢測器更好的解決方案。

此工具的快照顯示不同的.NET版本:







對於64位操作系統,路徑是:

HKEY_LOCAL_MACHINE\SOFTWARE\wow6432Node\Microsoft\NET Framework Setup\NDP\



.NET 4.5.1更新

現在.NET 4.5.1已經可用了,在註冊表中名為Release的鍵的實際值需要被檢查,而不僅僅是它的存在。 值為378758表示安裝了.NET Framework 4.5.1。 但是,如此處所述在Windows 8.1上這個值是378675。




有一個可用的GUI工具, ASoft .NET版本檢測器 ,它一直被證明是非常可靠的。 它可以通過在命令行上指定XML輸出的文件名來創建XML文件。

你可以使用這個自動化。 這是一個很小的程序,用非.NET相關語言編寫,不需要安裝。




我需要找出我的電腦上有哪個版本的.NET框架,我所做的只是去控制面板,選擇“卸載程序”選項。 之後,我按名稱對程序進行了排序,並找到了Microsoft .NET Framework 4 Client Profile。




這是一個PowerShell腳本來獲取已安裝的.NET框架版本

function Get-KeyPropertyValue($key, $property)
{
    if($key.Property -contains $property)
    {
        Get-ItemProperty $key.PSPath -name $property | select -expand $property
    }
}

function Get-VersionName($key)
{
   $name = Get-KeyPropertyValue $key Version
   $sp = Get-KeyPropertyValue $key SP
   $install = Get-KeyPropertyValue $key Install
   if($sp)
   {
        "$($_.PSChildName) $name SP $sp"
   }
   else{
    "$($_.PSChildName) $name"
   }
}

function Get-FrameworkVersion{
   dir "hklm:\SOFTWARE\Microsoft\NET Framework Setup\NDP\" |? {$_.PSChildName -like "v*"} |%{
    if( $_.Property -contains "Version")
    {
        Get-VersionName $_
    }
    else{
        $parent = $_
        Get-ChildItem $_.PSPath |%{
            $versionName = Get-VersionName $_
            "$($parent.PSChildName) $versionName"
            }
        }
    }
}


$v4Directory = "hklm:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full"
if(Test-Path $v4Directory)
{
    $v4 = Get-Item $v4Directory
    $version = Get-KeyPropertyValue $v4 Release
    switch($version){
        378389 {".NET Framework 4.5"; break;}
        378675 {".NET Framework 4.5.1 installed with Windows 8.1 or Windows Server 2012 R2"; break;}
        378758 {".NET Framework 4.5.1 installed on Windows 8, Windows 7 SP1, or Windows Vista SP2"; break;}
        379893 {".NET Framework 4.5.2"; break;}
        { 393295, 393297 -contains $_} {".NET Framework 4.6"; break;}
        { 394254, 394271 -contains $_} {".NET Framework 4.6.1"; break;}
        { 394802, 394806 -contains $_} {".NET Framework 4.6.2"; break; }
    }
}

它是基於如何:確定哪些.NET Framework版本安裝而編寫的。 請使用Get-FrameworkVersion()函數獲取有關已安裝的.NET框架版本的信息。




使用SignumFramework的Signum.Utilities庫(可以獨立使用),您可以很好地使用它,而無需親自處理註冊表:

AboutTools.FrameworkVersions().ToConsole();
//Writes in my machine:
//v2.0.50727 SP2
//v3.0 SP2
//v3.5 SP1












在Windows 7中(它也適用於Windows 8,但我沒有測試過):

轉到命令提示符

轉到命令提示符的步驟:

  1. 點擊開始菜單
  2. 在搜索框中,輸入“cmd”(不含引號)
  3. 打開cmd.exe

在cmd中輸入這個命令

wmic /namespace:\\root\cimv2 path win32_product where "name like '%%.NET%%'" get version

這樣就可以安裝最新版本的.NET Framework。

也可以嘗試Raymond.cc Utilities的相同。




請參閱如何:確定安裝哪些.NET Framework版本 (MSDN)。

MSDN提出了一個功能的例子,似乎做1-4版本的工作。 根據文章,方法輸出是:

v2.0.50727  2.0.50727.4016  SP2
v3.0  3.0.30729.4037  SP2
v3.5  3.5.30729.01  SP1
v4
  Client  4.0.30319
  Full  4.0.30319

請注意,對於“版本4.5和更高版本”還有另一個功能。