dll의 .NET Framework 버전 확인


137

.NET 프레임 워크에 대해 컴파일되어 배포 된 오래된 dll이 있습니다. 컴파일 된 .NET 프레임 워크 버전이 확실하지 않습니다. 이 dll이 컴파일 된 .NET 프레임 워크의 버전을 어떻게 확인할 수 있는지 궁금합니다. 소스 코드가 Visual Studio 2008로 업그레이드되었고 .NET Framework 버전 3.5로 변경되었다고 생각하기 때문에 소스 코드를 신뢰할 수 없습니다.


답변:


49

그것을 반사판에 넣고 그것이 참조하는 것을 봅니까?

예를 들면 다음과 같습니다.

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


1
내 생각도 있지만 반사판을 알고 있으면 아마 불평하고 설명 할 수없는 오류 아이콘이 나타납니다.
leppie

@leppie .NET 1.1 인 경우에도 문제가되지 않습니다. 기본 어셈블리 목록 만 변경하면됩니다.
ParmesanCodice

귀하의 답변은 매우 도움이되지만 맹목적으로 의존하지 않는 것이 좋습니다. 어제 저는 .Net 4.0을 대상으로 한 자체 프로젝트에 너무 많은 시간을 보냈습니다 .Reflector가 .Net 4.0.3을 사용하고 .Net 4.0.3을 사용하도록보고 Windows에서 닷넷 4.5 :-) 나는 소스와 이외의 프로젝트에이를 확인하기 위해 어떤 방법을 모른다 - 여기 참조 : stackoverflow.com/questions/13214503/...
greenoldman

3
Kat Lim Ruiz가 지적한 대로 무료 오픈 소스 대안 ILSpy 를 사용할 수도 있습니다 .
Marcus Mangelsdorf

이 답변은 나를 위해 일했습니다 : stackoverflow.com/a/3461027/2961177 .
ckkkitty

128

PowerShell에서 다음을 사용하여 대상 런타임을 얻을 수 있습니다.

$path = "C:\Some.dll"
[Reflection.Assembly]::ReflectionOnlyLoadFrom($path).ImageRuntimeVersion

Ben Griswold의 답변 에서 PowerShell에 이것을 적용했습니다 .

Visual Studio에 지정된 대상 프레임 워크 버전을 알고 싶다면 다음을 사용하십시오.

$path = "C:\Some.dll"
[Reflection.Assembly]::ReflectionOnlyLoadFrom($path).CustomAttributes |
Where-Object {$_.AttributeType.Name -eq "TargetFrameworkAttribute" } | 
Select-Object -ExpandProperty ConstructorArguments | 
Select-Object -ExpandProperty value

당신은 같은 것을 얻어야합니다

.NETFramework, 버전 = v4.5.2


4
이 답변이 가장 도움이됩니다. 2003 년 이후의 모든 Windows OS는 Powershell을 지원합니다. 다른 많은 답변이 제시하는 것처럼 추가 응용 프로그램 지원이 필요하지 않은 즉각적인 피드백을 제공하는 쉘. dll의 "일회성"검사에 좋습니다. 당신은 남자 @ swoogan입니다.
Nathan McCoy

1
TargetFrameworkVersion v3.5로 빌드 한 DLL에 대해이 작업을 수행했으며 v2.0.50727을 반환했습니다. 내가 무엇을 놓치고 있습니까?
BHSPitMonkey 2016 년

4
@BHSPitMonkey는 실제로 4 가지 런타임 버전 (1.0, 1.1, 2.0 및 4.0) 만있었습니다. .NET 3.0 및 3.5는 CLR 버전 2.0으로 컴파일됩니다. msdn.microsoft.com/ko-kr/library/bb822049(v=vs.110).aspx
Swoogan

1
이 스크립트는 RuntimeVersion 만 제공합니다. 질문은 TargetFrameworkversion에 대한 것입니다. 2.0,3.0,3.5로 컴파일 된 모든 어셈블리에 대해이 스크립트는 런타임 버전을 2.0.0.0으로 표시합니다
Kiran Vedula

3
나에게 ReflectionOnlyLoadFrom은 ImageRuntimeVersion을 반환하지만 CustomAttributes는 0을 반환합니다. ReflectionOnlyLoadFrom 대신 LoadFrom을 사용하면 예상되는 결과가 나타납니다. 어떤 이유? PSVersion 5.1.16299.251 CLR 버전 4.0.30319.42000
Bernard Vander 7

69

dotPeek 는이 정보를 보여주는 훌륭한 도구입니다.

Reflector를 잡는 데 약간의 문제가 있다면 이것이 좋은 대안입니다.

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


4
참고로, 한 가지 문제로 인해 DotPeek에서 JustDecompile로 전환했습니다. "특정 버전 = false"를 선택하면 DotPeek에 빈 버전이 표시되고 JustDecompile에 올바른 버전이 표시됩니다. 나를 위해 가치를 전환했다.
ashes999

좋아-Reflector에 대한 평가판을 설치하지 않고 원하는 것을 정확하게 수행했습니다.
bernhardrusch

49

ILDASM 을 사용할 수 있습니다 ...

ildasm.exe C:\foo.dll /metadata[=MDHEADER] /text /noil

출력에서 '메타 데이터 섹션'을 확인하십시오. 다음과 같습니다.

메타 데이터 섹션 : 0x424a5342, 버전 : 1.1, 추가 : 0, 버전 len : 12, 버전 : v4.0.30319

'version'태그는 .NET Framework 버전을 알려줍니다. 위의 예에서 4.0.30319입니다.


3
여기서 무엇을 찾고 있습니까? .NET 4.0을 의미합니까? // Metadata section: 0x424a5342, version: 1.1, extra: 0, version len: 12, versio n: v4.0.30319
PeterX

예, .NET 2의 경우 다음을 얻습니다. // 메타 데이터 섹션 : 0x424a5342, 버전 : 1.1, 추가 : 0, 버전 len : 12, 버전 : v2.0.50727
Simon

17

몇 가지 옵션이 있습니다. 관리되는 코드에서 프로그래밍 방식으로 가져 오려면 Assembly.ImageRuntimeVersion을 사용하십시오.

Dim a As Assembly = Reflection.Assembly.ReflectionOnlyLoadFrom("C:\path\assembly.dll")
Dim s As String = a.ImageRuntimeVersion

v2.0부터 명령 줄에서 ildasm.exe는 "MANIFEST"를 두 번 클릭하고 "Metadata version"을 찾으면이를 표시합니다. 이미지의 CLR 버전 확인


CurrentAppDomain에 대한 ImageRuntimeVersion을 얻는 방법은 무엇입니까?
Kiquenet


15

단순히

var tar = (TargetFrameworkAttribute)Assembly
          .LoadFrom("yoursAssembly.dll")
          .GetCustomAttributes(typeof(TargetFrameworkAttribute)).First();

1
이것이 다운 다운 된 이유를 모르겠지만 스 니펫을 실행하고 (System.Runtime.Versioning에 대한 참조가 필요합니다) 출력을 얻을 수 있습니다 (LINQPad에서) : TypeId typeof (TargetFrameworkAttribute) FrameworkName .NETFramework, 버전 = v4.0 FrameworkDisplayName .NET Framework 4
Sudhanshu Mishra

이 코드는 정식 버전의 프레임 워크를 검색하지 않습니다. "4.0"는 알아두면 좋지만 RegAsm.exe에 가려고하면 "v4.0.30319"가 더 유용합니다. 보다 완전한 버전 정보는 다음에서 찾을 수 있습니다. string tar = Assembly.LoadFrom (@ "myAssembly.dll"). ImageRuntimeVersion;
마틴

이것은 올바른 접근 방식처럼 보입니다. 어셈블리에이 특성이 적용되지 않는 상황이 있습니까? .NET Core 어셈블리로 테스트했으며 netcore 및 버전 번호를 올바르게보고합니다.
Adam Naylor

이것은 나를 위해 작동하지 않습니다. 이 GetCustomAttributes없습니다 TargetFrameworkAttribute. 그러나 ImageRuntimeVersion은 제대로 작동하지만 바이너리가 작성된 올바른 CLR을 검색합니다. 빌드 된 대상 프레임 워크 버전이 필요합니다.
Shameel Mohamed

13

Visual Studio를 통한 또 다른 옵션은 프로젝트에 DLL 참조를 추가 한 다음 새 참조를 마우스 오른쪽 버튼으로 클릭하고 속성을 클릭하면 런타임 버전에서 찾고있는 것을 볼 수 있습니다.

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


이 질문은 Visual Studio에서 DLL이 참조 될 때를 묻는 것이 아니라 PC에있는 ol .NET DLL을 묻습니다.
ashes999

7
이 답변은 PC에있는 ol .NET DLL에 대한 참조를 추가 할 수 있으며 해당 DLL에 해당하는 참조 아래의 항목 속성 중 하나는 "런타임 버전"입니다.
ALEXintlsos 2016 년

8

ILDASM을 사용하여이를 디 컴파일하고 참조되고있는 mscorlib의 버전을 살펴보십시오 (정상적으로 매우 정확해야 함).


4

가장 간단한 방법 : 텍스트 편집기에서 .dll을 열기 만하면됩니다. 마지막 줄 중 하나를보십시오. 여기에 이미지 설명을 입력하십시오


가장 좋은 옵션
Sisir

2
그러나 이것은 .Net 3.0
Sisir

2

이 작업을 수행하기 위해이 C # 콘솔 앱을 신속하게 작성했습니다.

https://github.com/stuartjsmith/binarydetailer

디렉토리를 매개 변수로 전달하면 각 dll 및 exe의 net 프레임 워크를 알려주는 것이 가장 좋습니다.


좋은 세부 정보를 제공합니다. 명령 줄 앱입니다. 명령 행에 디렉토리 이름을 전달해야합니다.
Philu

2

DiE라고도하는 " 감지하기 쉬운 "은 파일 형식을 결정하는 프로그램입니다. .dll 파일 또는 기타 (.exe) 파일과 함께 작동합니다. 상업용 및 비상업적 용도로는 절대적으로 무료입니다.

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


0

에서 보낸 경우 DotPeek에서 JetBrains볼 수 있습니다 Assembly Explorer.

이 스크린 샷을 볼 수 있습니까?  난 아니에요:(


0

여기에 대한 답변을 확장하면 종속 어셈블리가있는 경우 폭발 할 수 있습니다. 운이 좋으며 부양 가족이 어디에 있는지 (또는 운이 좋으면 GAC에 있음) 알고 있다면 도움이 될 것입니다 ...

using System.Reflection;
using System.Runtime.Versioning;
// ...
{
    AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += new ResolveEventHandler(CurrentDomain_ReflectionOnlyAssemblyResolve);
    var asm = System.Reflection.Assembly.LoadFrom(@"C:\Codez\My.dll");
    var targetFrameAttribute = asm.GetCustomAttributes(true).OfType<TargetFrameworkAttribute>().FirstOrDefault();
    targetFrameAttribute.Dump();
}

Assembly CurrentDomain_ReflectionOnlyAssemblyResolve(object sender, ResolveEventArgs args)
{
    var name = args.Name;

    if (name.StartsWith("Depends"))
        return System.Reflection.Assembly.ReflectionOnlyLoadFrom(@"C:\Codez\Depends.dll");

    return System.Reflection.Assembly.ReflectionOnlyLoad(args.Name);
}

참조 : https://weblog.west-wind.com/posts/2006/Dec/22/Reflection-on-Problem-Assemblies

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