실행 파일이 있는데이 파일을 시작해야하는 .NET 프레임 워크 버전을 알고 싶습니다.
어딘가에서이 정보를 쉽게 찾을 수있는 방법이 있습니까?
답변:
신뢰할 수있는 가장 가까운 방법 은 필요한 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 % 신뢰할 수있는 것으로 취급하지는 않겠지 만 조만간 바뀔 것이라고 생각하지 않습니다.
사용 메모장 삼 년 된, 크기 2백킬로바이트, 사전 설치된 도구를 :
notepad appname.exe
, F3
까지 .NET Framework,version=vX.Y
나타난다v2.
... 여전히 기가 바이트의 닷넷 분석기 도구와 쓰레기 스튜디오를 설치하는 것보다 100 배 더 쉽습니다.다른 편집기 / 뷰어도 Notepad ++ 또는 totalCommander의 훌륭한 텍스트 / 16 진수 뷰어 목록 과 같은 바이너리를 열 수 있습니다 .
보다 간단한 방법은 dotPeek 를 사용 하여 트리에 표시되는 내용을 확인하는 것입니다.
이제 ILSpy 를 사용 하여 어셈블리의 대상 프레임 워크를 검사 할 수 있습니다 . 어셈블리를로드 한 후 어셈블리 노드의 루트를 클릭하면 TargetFramework 선언 아래에서 정보를 찾을 수 있습니다.
[assembly: TargetFramework(".NETFramework,Version=v4.5", FrameworkDisplayName = ".NET Framework 4.5")]
코드에서 사용할 수 Assembly.ImageRuntimeVersion
있지만 파일을 보면 아마도 리플렉터를 사용하고 어떤 버전 mscorlib
이 참조되고 있는지 확인하는 것이 가장 좋습니다 .
편집 : ildasm 을 사용 하고 어셈블리를 연 다음 어셈블리에 대한 매니페스트를 보는 것이 더 좋습니다 . 매니페스트의 첫 번째 줄은 어셈블리가 빌드 된 정확한 CLR 버전을 알려줍니다 .
CorFlags.exe라는 도구를 사용할 수 있습니다. .NET 2.0부터 사용되어 왔으며 Windows SDK 7.0에 포함되어 있음을 확신합니다. 기본적으로 (Windows XP Pro에서는) C : \ Program Files \ Microsoft SDKs \ Windows \ v7.0A \ bin \ CorFlags.exe에 설치됩니다. 버전을 포함하는 헤더 정보를 표시하려면 관리되는 모듈에 대한 파일 경로 (다른 명령 줄 플래그 없음)를 제공합니다.
이 유틸리티는 모듈의 PE32 헤더를 수정하도록 설계되었으므로 설명서를 주의 깊게 읽을 때까지 플래그를 사용하지 마십시오 .
또는 System.Core에 대한 참조를 찾을 수 있습니다. 이 앱이 사용중인 .NET Framework 버전을 알려줍니다. 2.0의 경우 System.Core 버전은 2.0.xxx.xxx입니다. 3.5의 경우 버전은 3.5.xxx.xxx 등입니다.
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에 대해서도 동일하게 수행합니다.