2016-06-30 2 views
0

최근에, 나는 AAA.BBB.dll를 호출하자, 특정 DLL의 어셈블리 버전을 확인했고, 나는 즉, 그걸 얻기 위해 간단한 PowerShell 명령을 사용하기로 결정 :예기치 않은 결과() 버전

[Reflection.AssemblyName]::GetAssemblyName('AAA.BB.dll').Version 

이 명령은 내가 원하는 버전을 표시하지 않는다는 것을 깨달았습니다. 대부분의 경우 현재 디렉토리에있는 dll의 버전과 일치하지 않는 고정 된 버전을 표시합니다. GetAssemblyName 메소드에 잘못된 입력 (예 : 'AAA.BB.dll123')을 제공하더라도 예외를 던지는 대신 동일한 버전이 표시되었습니다. 절대 경로를 사용하여 시도하고 도움이되지 않았다. 또한 AAA.BB.dll이 GAC에 없는지 확인했습니다.

F # 대화 형으로 아날로그 코드를 호출하거나 .NET 반사기에서 해당 AAA.BB.dll을 열어 올바른 어셈블리 버전을 얻을 수있었습니다.

AssemblyName.GetAssemblyName에 대한 설명서를 확인한 결과 해당 동작에 대한 설명을 찾을 수 없습니다. 궁금하네요 :

  • 왜이 명령은 한 버전의 DLL을 지속적으로 표시합니까?

  • Powershell과 F # 대화식의 유사 코드 간의 차이점은 어떻게 설명 할 수 있습니까? 어셈블리 해결 메커니즘 또는 .NET Framework 구성 또는 .NET Framework 버전과 관련이 있습니까?

  • 잘못된 인수 (즉 'AAA.BB.dll123')로 GetAssemblyName을 호출해도 예외가 throw되지 않는 이유는 무엇입니까?

나는 어떤 DLL을 포함하지 M: 디렉토리에 실행 된 명령의 몇 가지에 대한 출력을 붙여 넣기하고있다.

PS M:\> [Reflection.AssemblyName]::GetAssemblyName('AAA.BB.dll').Version 

Major Minor Build Revision 
----- ----- ----- -------- 
1  0  600 8 


PS M:\> [Reflection.AssemblyName]::GetAssemblyName('aAAA.BB.dll').Version 
Exception calling "GetAssemblyName" with "1" argument(s): "Could not load file or assembly 'M:\aAAA.BB.dll' or one o 
f its dependencies. The system cannot find the file specified." 
At line:1 char:43 
+ [Reflection.AssemblyName]::GetAssemblyName <<<< ('aAAA.BB.dll').Version 
    + CategoryInfo   : NotSpecified: (:) [], MethodInvocationException 
    + FullyQualifiedErrorId : DotNetMethodException 

PS M:\> [Reflection.AssemblyName]::GetAssemblyName('AAA.BB.dll123').Version 

Major Minor Build Revision 
----- ----- ----- -------- 
1  0  600 8 


PS M:\> [Reflection.AssemblyName]::GetAssemblyName("AAA.BB.dll123").Version 

Major Minor Build Revision 
----- ----- ----- -------- 
1  0  600 8 


PS M:\> [Reflection.AssemblyName]::GetAssemblyName("AAA.BB123").Version 
Exception calling "GetAssemblyName" with "1" argument(s): "Could not load file or assembly 'M:\AAA.BB123' or one of 
its dependencies. The system cannot find the file specified." 
At line:1 char:43 
+ [Reflection.AssemblyName]::GetAssemblyName <<<< ("AAA.BB123").Version 
    + CategoryInfo   : NotSpecified: (:) [], MethodInvocationException 
    + FullyQualifiedErrorId : DotNetMethodException 

PS M:\> [Reflection.AssemblyName]::GetAssemblyName("AAA.BB.123").Version 

Major Minor Build Revision 
----- ----- ----- -------- 
1  0  600 8 

어셈블리 버전 1.0.600.8의 AAA.BB.dll은 해당 컴퓨터의 다른 디렉토리에 있습니다.

+0

'AAA.BB.dll'은 (는) 이전 COM 어셈블리가 아닙니다. – mxmissile

+0

아니요, 관리되는 DLL입니다 –

답변

0

더 이상 문제가 된 컴퓨터에 액세스 할 수 없지만 잘못 구성된 DEVPATH이 원인 일 수 있습니다. 디 컴파일러와 같은 일부 도구는 사용자가 디 컴파일 된 어셈블리를 디버깅 할 수 있도록 DEVPATH를 수정합니다.

this blog entry이 참인 경우 DEVPATH가 설정되면 모든 일반 어셈블리 조회 기능이 비활성화되고 DEVPATH의 어셈블리가 다른 모든 어셈블리보다 우선 적용됩니다. 이 경우 PowerShell이 ​​AAA.BB.dll의 고정 버전을 표시한다는 사실은 놀라운 일이 아닙니다. F #이 다른 버전의 .NET 런타임에서 실행되는 경우 해당 변경의 영향을받지 않을 수 있습니다.

+1

내부 메서드를 사용하면 경로를 건너 뜁니다.'([Reflection.AssemblyName] .GetMethod ('nGetFileInformation', @ ('nonpublic', 'static'))). Invoke ($ null, 'x : \ full \ path \ to \ assembly.dll'). – beatcracker

+0

@beatcracker 재미있는 질문. 슬프게도, 나는 더 이상 그 기계에 접근 할 수 없어, 나는 그것을 시험하지 않을 것이다. –