실행 파일을 실행하는 데 필요한 .NET Framework 버전을 확인하는 방법은 무엇입니까?


97

실행 파일이 있는데이 파일을 시작해야하는 .NET 프레임 워크 버전을 알고 싶습니다.

어딘가에서이 정보를 쉽게 찾을 수있는 방법이 있습니까?

(지금까지 운없이 ILDASMDUMPBIN 을 시도했습니다 .)



docs.microsoft.com/en-us/sysinternals/downloads - 프로세스 익스플로러는 아주 잘이 작업을 수행하고 사용하기 쉬운, 단지 관리자로 실행
AquaAlex

답변:


55

신뢰할 수있는 가장 가까운 방법 은 필요한 CLR 버전을 결정하는 것 입니다. ILDASM을 사용하고 "MANIFEST"노드 또는 Reflector를 확인하고 "Application.exe"노드의 dissasembly 뷰를 IL로 확인하면됩니다. 두 경우 모두 CLR 버전을 나타내는 주석이 있습니다. ILDASM에서 주석은 "// 메타 데이터 버전"이고 Reflector에서 주석은 "대상 런타임 버전"입니다.

다음은 WindowsFormsApplication1.exe라는 .NET WinForms 응용 프로그램의 예입니다.

ILDASM :

// Metadata version: v2.0.50727
.assembly extern mscorlib
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .z\V.4..
  .ver 2:0:0:0
}
.assembly extern System
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .z\V.4..
  .ver 2:0:0:0
}

반사기:

.module WindowsFormsApplication1.exe
.subsystem 0x0002
// MVID: {CA3D2090-16C5-4899-953E-4736D6BC0FA8}
// Target Runtime Version: v2.0.50727

참조 된 어셈블리 목록을보고 버전 번호가 가장 높은 참조를 찾을 수도 있습니다.

다시 말하지만 ILDASM을 사용하여 "MANIFEST"노드 데이터를 확인합니다.

.assembly extern System.Drawing
{
  .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A )                         // .?_....:
  .ver 2:0:0:0
}
.assembly extern System.Core
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .z\V.4..
  .ver 3:5:0:0
}

그리고 Reflector를 사용하여 나열된 각 참조에 대한 dissambly (여전히 IL)를 살펴 봅니다.

.assembly extern System.Core
{
    .ver 3:5:0:0
    .publickeytoken = (B7 7A 5C 56 19 34 E0 89)
}

가장 높은 버전의 메타 데이터가 포함 된 참조를 찾으면 참조가 제공된 Framework 버전을 확인할 수 있습니다. 이는 응용 프로그램을 실행하기 위해 동일한 버전의 Framework가 설치되어 있어야 함을 나타냅니다. 즉, 나는 이것을 100 % 신뢰할 수있는 것으로 취급하지는 않겠지 만 조만간 바뀔 것이라고 생각하지 않습니다.


4
불행히도 Microsoft는 위의 기술에 대한 주요 변경 사항을 도입했습니다. .NET 4.5 어셈블리는 원시 .NET 4에서 실행할 수 없으며 .NET 4.5 어셈블리에 알리려면 System.Runtime.Versioning.TargetFrameworkAttribute도 읽어야합니다. lextm.com/2013/02/how-to-tell-net-45-only-assemblies.html
Lex Li

56

사용 메모장 삼 년 된, 크기 2백킬로바이트, 사전 설치된 도구를 :

  • 로 애플리케이션 열기 notepad appname.exe,
  • "framework"라는 단어를 검색하고
  • 와 반복 마지막 검색 F3까지 .NET Framework,version=vX.Y나타난다
  • 아무것도 발견되지 않으면 (3.0 이하 버전) 검색 v2.... 여전히 기가 바이트의 닷넷 분석기 도구와 쓰레기 스튜디오를 설치하는 것보다 100 배 더 쉽습니다.

다른 편집기 / 뷰어도 Notepad ++ 또는 totalCommander의 훌륭한 텍스트 / 16 진수 뷰어 목록 과 같은 바이너리를 열 수 있습니다 .


당신이 디 컴파일 / 기타 도구에 액세스 할 수없는 경우 특히이 증조이다
크레이그

@BentTranberg 흥미 롭습니다. gmail com에서 asainnp를 어떻게 든 저에게 보낼 수 있습니까?
Asain Kujovic 2018 년

32

보다 간단한 방법은 dotPeek 를 사용 하여 트리에 표시되는 내용을 확인하는 것입니다.

속성 패널을 참조하십시오. 여기에 이미지 설명 입력


22

이제 ILSpy 를 사용 하여 어셈블리의 대상 프레임 워크를 검사 할 수 있습니다 . 어셈블리를로드 한 후 어셈블리 노드의 루트를 클릭하면 TargetFramework 선언 아래에서 정보를 찾을 수 있습니다.

[assembly: TargetFramework(".NETFramework,Version=v4.5", FrameworkDisplayName = ".NET Framework 4.5")]

2
참고 TargetFrameworkAttribute는 단지 .NET 4.0에서 추가되었다, 그래서 .NET 3.5 또는 이전 버전에 대해 컴파일 된 어셈블리에 존재하지 않습니다.
Wai Ha Lee

ILSpy는로드 된 어셈블리 루트 노드를 클릭 할 때 주석에 "런타임 : vXXX"를 표시합니다. v1.1.4322 프레임 워크 프로젝트를 볼 수있었습니다.
ryancdotnet

15

코드에서 사용할 수 Assembly.ImageRuntimeVersion있지만 파일을 보면 아마도 리플렉터를 사용하고 어떤 버전 mscorlib이 참조되고 있는지 확인하는 것이 가장 좋습니다 .

편집 : ildasm 을 사용 하고 어셈블리를 연 다음 어셈블리에 대한 매니페스트를 보는 것이 더 좋습니다 . 매니페스트의 첫 번째 줄은 어셈블리가 빌드 된 정확한 CLR 버전을 알려줍니다 .


3
이것은 잘못되었습니다. OP는 CLR 런타임 버전이 아닌 .NET Framework 버전에 대해 질문했습니다. 이 답변은 후자를 다룹니다. 예를 들어 CLR 런타임 버전 4.0.30139를 사용하는 Framework 4.7.2531.0에 대해 실행 중입니다. ImageRuntimeVersion은 Framework 버전이 아닌 CLR 버전을 반환합니다.
Tom Baxter

11

CorFlags.exe라는 도구를 사용할 수 있습니다. .NET 2.0부터 사용되어 왔으며 Windows SDK 7.0에 포함되어 있음을 확신합니다. 기본적으로 (Windows XP Pro에서는) C : \ Program Files \ Microsoft SDKs \ Windows \ v7.0A \ bin \ CorFlags.exe에 설치됩니다. 버전을 포함하는 헤더 정보를 표시하려면 관리되는 모듈에 대한 파일 경로 (다른 명령 줄 플래그 없음)를 제공합니다.

이 유틸리티는 모듈의 PE32 헤더를 수정하도록 설계되었으므로 설명서를 주의 깊게 읽을 때까지 플래그를 사용하지 마십시오 .


2
.Net4 및 .Net4.5을 구별 할 수 없습니다
mheyman

11

명령 줄에서 : find "Framework" MyApp.exe


2

또는 System.Core에 대한 참조를 찾을 수 있습니다. 이 앱이 사용중인 .NET Framework 버전을 알려줍니다. 2.0의 경우 System.Core 버전은 2.0.xxx.xxx입니다. 3.5의 경우 버전은 3.5.xxx.xxx 등입니다.


나는 이것이 사실이라고 생각하지 않는다. 4.5의 대상 프레임 워크가 있지만 System.Core 4.0.XXX.XXX를 사용합니다
Paul Totzke

2

Powershell을 사용하여 Windows에서 파일의 .NET 버전을 얻을 수 있습니다. 다음 스크립트;

$path=’.\’
$ErrorActionPreference = "SilentlyContinue"
$files=Get-ChildItem -Path $path -Recurse -include *.dll,*.exe
foreach($file in $files)
{
    $filename = $file.BaseName
    $version = $([System.Reflection.Assembly]::ReflectionOnlyLoadFrom($file.FullName).GetCustomAttributesData() |
                 select-object -ExpandProperty ConstructorArguments | 
                 select-object -ExpandProperty Value | 
                 select-string -Pattern '.NET')
    Write-Output "$filename,$version"
}

다음 결과를 제공합니다. 여기에 이미지 설명 입력

결과는 해당 폴더의 exe 파일에 대한 .NET 버전을 추출하지만 dll에 대해서도 동일하게 수행합니다.


1

Linux / OSX / unix에서는 다음을 사용할 수 있습니다.

strings that_app.exe | grep 'v2.\|Framework'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.