.NET Frameworkのバージョンとサービスパックがインストールされているものを検出するにはどうすればよいですか?


同様の質問がここで尋ねられましたが 、.NET 3.5固有のものでした。 具体的には、私は次を探しています:

  1. どの.NET FrameworkのバージョンとService Packがインストールされているかを判断する正しい方法は何ですか?
  2. 使用できるレジストリキーのリストはありますか?
  3. フレームワークのバージョン間に依存関係はありますか?



Answers


レジストリは Frameworkの特定のバージョンがインストールされているかどうかを検出する公式の方法です。

探しているFrameworkのバージョンに応じて、必要なレジストリキーが変わります。

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

ただし、数値が( REG_DWORD )ではなく文字列( REG_SZ )である.NET 1.0を除きます。

サービスパックレベルの決定は、同様のパターンに従います。

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の場合、これらのキーの文字列値は、#、#、####、#の形式をとります。 最後の#はサービスパックレベルです。

私は明示的にこれを求めていませんが、フレームワークの正確なバージョン番号を知りたい場合は、次のレジストリキーを使用します。

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の場合、これらのキーのいずれかの文字列の値は、 #,#,####,#形式になります。 文字列の#,#,####部分はフレームワークのバージョンです。

  • .NET 1.1では、バージョン番号を表すレジストリキー自体の名前を使用します。

  • 最後に、依存関係を見ると、.NET 3.0には.NET 2.0に追加機能が追加されているため、.NET 3.0がインストールされていると正しく言えるように、.NET 2.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バージョン4.0)の新しいバージョンがインストールされます。これはCLR 2.0と並行して実行できます。

.NET 4.5のアップデート

.NET 4.5がインストールされている場合、レジストリにv4.5キーはありません。 代わりに、 HKLM\Software\Microsoft\NET Framework Setup\NDP\v4\FullキーにReleaseという値が含まれているかどうかを確認する必要があります。 この値が存在する場合、.NET 4.5がインストールされます。それ以外の場合はインストールされません。 詳細はこちらとこちらをご覧ください




この質問に対する公式のMicrosoftの回答は、次のナレッジベースの記事です。

文書番号:318785 - 最終更新日:2008年11月7日 - リビジョン:20.1インストールされている.NET FrameworkのバージョンとService Packが適用されているかどうかを確認する方法

残念ながら、2.0ディレクトリのmscorlib.dllバージョンには2.0バージョンがあり、3.5 SP1がインストールされていても3.0または3.5ディレクトリにはmscorlib.dllバージョンがないため、動作しないように見えます正式なマイクロソフトの回答は間違っているだろうか?




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のサブキーを列挙しHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP 。 各サブキーは.NETバージョンです。 それはマシンに存在する場合はInstall=1値、MSIを使用してインストールされている場合はサービスパックを示すSP値、 MSI=1値を持つ必要があります。 (Windows Vistaの.NET 2.0には、たとえばOSの一部であるため、最後のものはありません)。




自分のシステムに.NETバージョン4.5.2がインストールされているかどうかを検出したいのですが、 ASoft .NETバージョン検出ツールよりも優れたソリューションは見つかりませんでした。

異なる.NETバージョンを表示するこのツールのスナップショット:




FWIW ... ここでは実世界で広くテストされているようだが(ただしC言語である)




64ビットOSの場合、パスは次のようになります。

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を見つけました。




インストールされている.NETフレームワークのバージョンを取得するためのPowerShellスクリプト

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のどのバージョンがインストールされているかを判断する方法に基づいて作成されています 。 インストールされている.NETフレームワークのバージョンに関する情報を取得するには、Get-FrameworkVersion()関数を使用してください。




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 Utiltiesも同じように試してみることができます。




方法:インストールされている.NET Frameworkのバージョン (MSDN)を確認する方法を参照してください。

MSDNはバージョン1-4のために仕事をするように思われる1つの関数の例を提案します。 この記事によれば、方法の出力は次のとおりです。

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以降」には別の機能があります。