설치된 .NET Framework 버전 및 서비스 팩을 어떻게 탐지합니까?


289

비슷한 질문이 여기 에 요청 되었지만 .NET 3.5에만 해당됩니다. 특히, 나는 다음을 찾고 있습니다.

  1. 어떤 .NET Framework 버전과 서비스 팩이 설치되어 있는지 확인하는 올바른 방법은 무엇입니까?
  2. 사용할 수있는 레지스트리 키 목록이 있습니까?
  3. Framework 버전간에 종속성이 있습니까?


그렇습니다. 나는 이미 첫 번째 것을 알았습니다 (내 질문에서 언급 한 것입니다). 나는 다른 것에 대해 몰랐다.
Scott Dorman

3
이 질문 (답변 포함)과 밀접하게 관련된 모든 질문이 SKU 값 의 존재를 완전히 무시하는 방식에 깊은 인상을 받았습니다 . 이는 4.5와 4.5.1 사이에서도 차이가 있습니다.
springy76

@ springy76, 이것이 SKU 값의 존재를 다루지 않는 이유는 설치된 버전의 프레임 워크를 결정하기 위해 관련이 없기 때문입니다. 당신이 말하는 질문은 실제로 ".NET 4.0.2"가 설치되어 있는지 확인하는 것입니다. 여기서 문제는 .NET 4.0.2가 없었으며 Framework 릴리스 또는 서비스 팩이 아닌 업데이트 (KB2544514)였습니다. 설치된 업데이트를 감지하는 방법에 대한 자세한 내용은 MSDN ( msdn.microsoft.com/en-us/library/hh925567(v=vs.110).aspx ) 에서이 문서 를 참조하십시오.
Scott Dorman

답변:


365

레지스트리는 특정 버전의 Framework가 설치되어 있는지 확인하는 공식적인 방법 입니다.

여기에 이미지 설명을 입력하십시오

필요한 레지스트리 키는 찾고있는 Framework 버전에 따라 변경됩니다.

프레임 워크 버전 레지스트리 키
-------------------------------------------------- ----------------------------------------
1.0 HKLM \ Software \ Microsoft \ .NETFramework \ 정책 \ v1.0 \ 3705 
1.1 HKLM \ Software \ Microsoft \ NET Framework 설치 \ NDP \ v1.1.4322 \ 설치 
2.0 HKLM \ Software \ Microsoft \ NET Framework 설치 \ NDP \ v2.0.50727 \ 설치 
3.0 HKLM \ Software \ Microsoft \ NET Framework 설치 \ NDP \ v3.0 \ Setup \ InstallSuccess 
3.5 HKLM \ Software \ Microsoft \ NET Framework 설치 \ 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 설치 \ 설치된 구성 요소 \ {78705f0d-e8db-4b2d-8193-982bdda15ecd} \ Version 
1.0 [1] HKLM \ 소프트웨어 \ Microsoft \ Active 설치 \ 설치된 구성 요소 \ {FDC11A6F-17D1-48f9-9EA3-9051954BAA24} \ 버전 
1.1 HKLM \ Software \ Microsoft \ NET Framework 설치 \ NDP \ v1.1.4322 \ SP 
2.0 HKLM \ Software \ Microsoft \ NET Framework 설치 \ NDP \ v2.0.50727 \ SP 
3.0 HKLM \ Software \ Microsoft \ NET Framework 설치 \ NDP \ v3.0 \ SP 
3.5 HKLM \ Software \ Microsoft \ NET Framework 설치 \ 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의 경우이 키 중 하나의 문자열 값 형식은 #, #, ####, #입니다. 마지막 #은 서비스 팩 수준입니다.

명시 적으로 요청하지는 않았지만 Framework의 정확한 버전 번호를 알고 싶다면 다음 레지스트리 키를 사용하십시오.

프레임 워크 버전 레지스트리 키
-------------------------------------------------- ----------------------------------------
1.0 HKLM \ Software \ Microsoft \ Active 설치 \ 설치된 구성 요소 \ {78705f0d-e8db-4b2d-8193-982bdda15ecd} \ Version 
1.0 [1] HKLM \ 소프트웨어 \ Microsoft \ Active 설치 \ 설치된 구성 요소 \ {FDC11A6F-17D1-48f9-9EA3-9051954BAA24} \ 버전 
1.1 HKLM \ Software \ Microsoft \ NET Framework 설치 \ NDP \ v1.1.4322 
2.0 [2] HKLM \ 소프트웨어 \ Microsoft \ NET Framework 설치 \ NDP \ v2.0.50727 \ 버전 
2.0 [3] HKLM \ 소프트웨어 \ Microsoft \ NET Framework 설치 \ NDP \ v2.0.50727 \ 증가
3.0 HKLM \ Software \ Microsoft \ NET Framework 설치 \ NDP \ v3.0 \ Version 
3.5 HKLM \ Software \ Microsoft \ NET Framework 설치 \ 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가 설치되고 그렇지 않은 경우 .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 폴더에는 하나의 키만 있습니다. , (기본값) 값이 더 이상 사용되지 않습니다.
RandomEngy

2
이 게시물은 4.5를 다루지 않으며 4.5가 설치되어 있어도 레지스트리에 나열되지 않습니다.
Klas Mellbourn

37
Microsoft는 아무도 -version 스위치를 추가하려고 생각하지 않았습니까?
gnuchu

2
그것은 농담. 나는 그것이 바보 바보라고 믿을 수 없다!
Alex Byrth

17

다음 기술 자료 문서에서이 질문에 대한 공식 Microsoft 답변이 있습니다.

기사 ID : 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-처음에 페이지를 연결 한 이후 Microsoft가 해당 페이지를 업데이트 한 것으로 보입니다. 그래서 그것은 그 문제에 대한 최고의 공식 출처 중 하나 일 것 같습니다.
jpierson

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")관리자가 아닌 사용자에 대한 보안 예외를 방지 할 수 있습니다.
Jon Cage

Cool, LinqPad를 사용했는데 완벽한 결과를 얻었습니다! share.linqpad.net/5cjihh.linq
user917170

서비스 팩 버전이 설치된 것과 같은 작은 세부 정보에 대해서는 공유하는 것이 이상하지만 프레임 워크가 부분적으로 또는 완전히 설치되어있는 경우 더 중요한 정보는 코드에서 무시됩니다 !! 레지스트리 키 "클라이언트"와 "전체"를 동일하게 취급하는 것은 잘못입니다. "클라이언트"키만 종료하면 (예 : System.Web) 사용할 수 없습니다. 이 중요한 정보는 코드에서 반환해야합니다! 사용자가 제어판에서 ".NET Framework 4 Extended"를 제거한 경우 몇 개의 어셈블리가 없습니다.
Elmue

8

내 시스템에 설치된 .NET 버전 4.5.2가 있는지 감지하고 싶었고 ASoft .NET Version Detector 보다 나은 솔루션을 찾지 못했습니다 .

다른 .NET 버전을 보여주는이 도구의 스냅 샷 :

다른 .NET 버전을 보여주는이 도구의 스냅 샷


7

의 하위 키를 열거하십시오 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP. 각 하위 키는 .NET 버전입니다. Install=1시스템에있는 MSI=1경우 값 , 서비스 팩을 표시하는 SP 값 및 MSI를 사용하여 설치된 경우 값을 가져야 합니다 . (예 : Windows Vista의 .NET 2.0에는 OS의 일부이므로 마지막 버전이 없습니다.)


내 컴퓨터 (XP Pro)에서이 키를 찾지 못했지만 HKLM \ SOFTWARE \ Microsoft \ .NETFramework입니다. 그러나 당신이 묘사하는 다양한 가치는 나에게 존재하지 않습니다.
Charlie

.NET 1.1 이상이 설치되어있는 경우이 키가 있어야합니다. 언급 한 키는 .NET 1.0에만 사용되었습니다.
Scott Dorman

reg 쿼리 "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 비트 키 (64 비트 키와 동일한 이름을 가진 많은 32 비트 키)로 나뉩니다. Wow6432Node레지스트리 키 WOW64 레지스트리 리플렉터의 일부인 미러 64 비트 및 32 비트 레지스트리보기 사이의 특정 키 값. 레지스트리가 리디렉션 및 미러링을 자동으로 처리하므로이 키에 직접 액세스 할 필요가 없습니다.
Scott Dorman

5

.NET 4.5.1 업데이트

.NET 4.5.1을 사용할 수있게되었으므로 레지스트리에서 Release라는 Release 키의 실제 값을 확인해야합니다. 378758 값은 .NET Framework 4.5.1이 설치되었음을 의미합니다. 그러나 여기 설명 된 대로이 값은 Windows 8.1에서 378675입니다.


5

GUI 툴인 ASoft .NET Version Detector 가 있으며, 이는 항상 신뢰성이 높은 것으로 입증되었습니다. 명령 행에서 XML 출력의 파일 이름을 지정하여 XML 파일을 작성할 수 있습니다.

이것을 자동화에 사용할 수 있습니다. .NET에 의존하지 않는 언어로 작성된 작은 프로그램이며 설치가 필요하지 않습니다.


4

컴퓨터에 어떤 버전의 .NET 프레임 워크가 있는지 확인해야했습니다. 제어판으로 가서 "프로그램 제거"옵션을 선택하기 만하면됩니다. 그 후 프로그램을 이름별로 정렬하고 Microsoft .NET Framework 4 Client Profile을 찾았습니다.


1
고마워-내가 시도한 다른 모든 "솔루션"에 결함이 있었고 작동하지 않았습니다. 그렇습니다.
user20493

이 정보를 찾은 이유는 적어도 .NET Framework와 관련하여 프로그램 제거 아래의 내용을 완전히 신뢰할 수 없기 때문입니다.
tobbenb3

3

설치된 .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 () 함수를 사용하십시오.


2

은 Using 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을 구분하지 않는 한 완벽하지 않습니다. 또한 프레임 워크 버전 간의 종속성을 고려하지 않습니다.
Scott Dorman

2
좋은 해결책이 아닙니다. 약 3 줄의 코드로 동일한 작업을 직접 수행 할 수있을 때 .NET 버전을 얻기 위해 전체 라이브러리를 다운로드해야 할 이유가 없습니다. 프로그래머는 "레지스트리를 직접 다룰 수"있어야합니다.
TheSmurf

3
@DannySmurf 동의하지 않습니다. .NET 3.0이 도입되었을 때 MS는 이것을 동일한 CLR에 FX 레이어가 두 개 이상있는 즉시이를 .NET API로 래핑해야했습니다. 응용 프로그램에서 유틸리티 라이브러리를 사용하도록하고 싶습니다. 4.1, 6.1, 7.100이 도착하면 라이브러리와 응용 프로그램에 필요한 .NET 계층에 대한 구성 항목을 업데이트 할 수 있습니다. 물론 라이브러리가 작동하지 않으면이 논쟁은 물을 보유하지 않습니다.
yzorg


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 utility와를 동일합니다.


1
그 라인을 실행 cmd하면 나에게 준다 ERROR: Description = Invalid namespace.
MEMark

나는 또한 얻는다ERROR: Description = Invalid namespace
Peter

이 명령은 나에게 오류를 준다! (Windows 7 터미널에서 실행)
Smrita

알려 주셔서 감사합니다. MEMark, Peter, Smrita.
Mayank Agarwal
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.