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


289

同様の質問がここで行われましたが、それは.NET 3.5に固有のものでした。具体的には、以下を探しています。

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

2
この質問は、stackoverflow.com / questions / 198931
Pascal Paradis

はい、そうです。最初の1つはすでに知っていました(これは私の質問で言及しているものです)。他のことは知りませんでした。
スコットドーマン、

3
この質問(回答を含む)と密接に関連するすべての質問がSKU値の存在を完全に無視していることに感銘を受けました。これは、4.5と4.5.1を区別します。
springy76 2014年

@ springy76、これがSKU値の存在に対処しない理由は、Frameworkのどのバージョンがインストールされているかを判断するために、それらが関連していないためです。あなたが参照する質問は、「。NET 4.0.2」がインストールされているかどうかを実際に判断しようとしていることです。ここでの問題は、.NET 4.0.2がなかったということです。これは、フレームワークのリリースやサービスパックではなく、更新(KB2544514)でした。インストールされている更新プログラムを検出する方法の詳細については、MSDN(msdn.microsoft.com/en-us/library/hh925567 ( v=vs.110 ) .aspx)でこの記事を参照してください
スコットドーマン

回答:


365

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

ここに画像の説明を入力してください

必要なレジストリキーは、探しているフレームワークのバージョンによって異なります。

フレームワークバージョンレジストリキー
-------------------------------------------------- ----------------------------------------
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クライアントプロファイルHKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Client \ Install
4.0フルプロファイルHKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Full \ Install

一般的にあなたが探しているのは:

"Install"=dword:00000001

.NET 1.0を除き、値は数値(REG_SZ)ではなく文字列(REG_DWORD)です。

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

フレームワークバージョンレジストリキー
-------------------------------------------------- ----------------------------------------
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クライアントプロファイルHKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Client \ Servicing
4.0フルプロファイルHKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Full \ Servicing

[1] Windows Media CenterまたはWindows XP Tablet Edition

ご覧のように、Windows Media CenterまたはWindows XP Tablet Editionを実行している場合、.NET 1.0のSPレベルの決定が変更されます。繰り返しますが、.NET 1.0は文字列値を使用しますが、他のすべてはDWORDを使用します。

.NET 1.0の場合、これらのキーのいずれかの文字列値の形式は、#、#、####、#です。最後の#はService Packレベルです。

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

フレームワークバージョンレジストリキー
-------------------------------------------------- ----------------------------------------
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クライアントプロファイルHKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Version 
4.0フルプロファイルHKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Version 

[1] Windows Media CenterまたはWindows XP Tablet Edition
[2] .NET 2.0 SP1
[3] .NET 2.0オリジナルリリース(RTM)

繰り返しますが、.NET 1.0は文字列値を使用しますが、他のすべてはDWORDを使用します。

その他の注意事項

  • .NET 1.0の場合、これらのキーのいずれかの文字列値の形式は#,#,####,#です。#,#,####文字列の一部はフレームワークのバージョンです。

  • .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の更新

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


1
これはVista x64の.NET 1.1では機能しないようです。可能な場所にv1.1.xキーがありません。アイデア?
Chris Hynes、

7
.NET 4.0のキーは正確ではありません。次のキーが表示されます:HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Client \ Install HKLM \ Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Full \ Install v4.0フォルダーには1つのキーしかありません、(デフォルト)非推奨の値。
RandomEngy 2010

2
この投稿は4.5をカバーしておらず、4.5がインストールされていてもレジストリにリストされていません。
Klas Mellbourn、

37
マイクロソフトでは、誰も-versionスイッチを追加することを考えていませんでしたか?
gnuchu 2013

2
それは冗談だ。私はそれがすごい愚かであると信じることができません!
Alex Byrth 16

17

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

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

残念ながら、2.0ディレクトリのmscorlib.dllバージョンには2.0バージョンがあり、3.5 SP1がインストールされていても3.0または3.5ディレクトリのいずれかにmscorlib.dllバージョンがないため、動作しないようです...理由公式のMicrosoftの回答はそれほど誤解されているでしょうか?


2
+1-最初にリンクしてから、マイクロソフトがそのページを更新した可能性があります。だから、それは問題に関する最高の公式情報源の一つかもしれないように見えます。
jpierson 2011年

2
4.0までしか上がりません
user316117

16

Framework 4ベータ版は、異なるレジストリキーにインストールされます。

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);
            }
        }
    }
}

1
に変更Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP", true)Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP")て、管理者以外のユーザーのセキュリティ例外を回避します。
ジョンケージ

かっこいい、LinqPadを使用したところ、完璧な結果が得られました。share.linqpad.net/5cjihh.linq
user917170

小さな詳細(どのサービスパックのバージョンがインストールされているかなど)について共有するのは奇妙ですが、より重要な情報(フレームワークが部分的または完全にのみインストールされている場合)はコードによって無視されます。レジストリキー "Client"と "Full"を同じものとして扱うのは間違っています。たとえば、「クライアント」キーだけが存在する場合、System.Webは使用できません。この重要な情報は、コードからも返されます。ユーザーがコントロールパネルで ".NET Framework 4 Extended"をアンインストールした場合、いくつかのアセンブリが失われます。
Elmue、2015年

8

システムにインストールされている.NETバージョン4.5.2の存在を検出したかったのですが、ASoft .NETバージョン検出器よりも優れた解決策はありませんでした。

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

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


7

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


私のマシン(XP Pro)ではこのキーは見つかりませんでしたが、HKLM \ SOFTWARE \ Microsoft \ .NETFrameworkにありました。しかし、あなたが説明するさまざまな価値観は私には存在しません。
チャーリー

.NET 1.1以降がインストールされている場合は、このキーが必要です。あなたが言及したキーは.NET 1.0でのみ使用されました。
スコットドーマン

reg query "HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ NET Framework Setup \ NDP"
enthus1ast

5

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

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

10
これは「やや」真実です。64ビットバージョンのWindowsのレジストリは、32ビットキーと64ビットキーに分かれています(32ビットキーの多くは、64ビットキーと同じ名前です)。Wow6432Nodeレジストリキーは、64ビットと32ビットのレジストリビュー間WOW64レジストリリフレクタ、ミラー特定のキーと値の一部です。レジストリが自動的にリダイレクトとミラーリングを処理するため、このキーに直接アクセスする必要はありません。
スコットドーマン

5

.NET 4.5.1の更新

.NET 4.5.1が利用できるようになったので、レジストリ内のReleaseという名前のキーの実際の値だけでなく、その存在を確認する必要があります。値378758は、.NET Framework 4.5.1がインストールされていることを意味します。ただし、ここで説明するように、この値はWindows 8.1では378675です。


5

常に高い信頼性が証明されているASoft .NET Version Detectorの GUIツールがあります。コマンドラインでXML出力のファイル名を指定することにより、XMLファイルを作成できます。

これを自動化に使用できます。これは.NETに依存しない言語で書かれた小さなプログラムであり、インストールは必要ありません。


4

コンピューターにインストールされている.NET Frameworkのバージョンを確認する必要がありました。コントロールパネルに移動して[プログラムのアンインストール]オプションを選択するだけでした。その後、プログラムを名前順に並べ替えたところ、Microsoft .NET Framework 4 Client Profileが見つかりました。


1
ありがとう-私が試した他のすべての「解決策」には欠陥があり、機能しませんでした。これはしました。
user20493

私がこの情報を探しに来た理由は、少なくとも.NET Frameworkに関しては、[プログラムのアンインストール]にあるものは完全に信頼できないためです。
tobbenb3 2013年

3

インストールされている.NET Frameworkのバージョンを取得する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 Frameworkのバージョンに関する情報を取得するには、Get-FrameworkVersion()関数を使用してください。


2

使用Signum.UtilitiesのからライブラリをSignumFramework(スタンドアロン使用することができます)、あなたはうまくそれを取得し、自分でレジストリを扱うことなく、することができます:

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

2
このメソッドのコードを見ると、使用するレジストリキーまでは完全ではなく、.NET 1.0を完全に見逃してしまい、.NET 2.0(RTM)と.NET 2.0 SP1を区別していません。また、フレームワークのバージョン間の依存関係も考慮されていません。
スコットドーマン

2
良い解決策ではありません。自分で同じ作業を約3行のコードで実行できる場合は、.NETバージョンを取得するためだけにライブラリ全体をダウンロードする理由はありません。プログラマーとして、「レジストリーを自分で処理する」ことができるべきです。
TheSmurf 2009年

3
@DannySmurf同意しない。.NET 3.0が導入されたとき、MSはこれを.NET APIでラップしているはずです(同じCLRにFXのレイヤーが2つ以上あるとすぐに)。アプリケーションでユーティリティライブラリを使用したい場合、4.1、6.1、7.10が到着したら、ライブラリと、アプリが必要とする.NETのレイヤーの構成エントリを更新できます。もちろん、どのライブラリーも機能しない場合、この議論は水を保持しません。
yzorg 2010

1

方法:インストールされている.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以降」には別の機能があることに注意してください。


1

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ユーティリティを同じように試すこともできます。


1
その行を実行すると、cmd私に与えられます ERROR: Description = Invalid namespace
MEMark 2014

私も得るERROR: Description = Invalid namespace
ピーター

このコマンドを実行するとエラーが発生します。(Windows 7ターミナルから実行)
Smrita 2015年

通知をありがとうMEMark、Peter、Smrita。
Mayank Agarwal、2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.