2012-12-07 3 views
0

다음과 같은 상황에서 어떤 어셈블리 어셈블리가 발생하는지 알 수 있습니까? 내 빈에서어셈블리 해결 및 병합 어셈블리

내 EXE 2 DLL의이 :

  • 어셈블리 A (버전 1), B와 C는 X로 통합 (그래서 1로 4 어셈블리)
  • 어셈블리 A (버전 2)

내가 만든 모든 참조에는 UserSpecificVersion 매개 변수가 포함되지 않았습니다.

  • 이제 내 exe에서 통화 중에 A가 사용 중입니까?
  • 또한 어셈블리 B의 호출 중에 A가 사용됩니까?

그리고 무엇 다른 (그래서 첫 번째 B에서 다음 내 EXE)의 주위에 방법

여기에 대한 문서가 인 경우?

답변

0

내가 작성한 모든 참조에는 UserSpecificVersion 매개 변수가 포함되지 않았습니다.

실제로 참조 어셈블리에 대해 "특정 버전"설정을 의미하고 False로 설정했다고 가정합니다. 컴파일시에만 런타임시 효과가 없습니다. 어셈블리를 추가하면 참조 어셈블리의 [AssemblyVersion]이 기록됩니다. 그런 다음 나중에, 프로그램을 다시 컴파일 할 수 있지만 다른 버전을 가진 참조 어셈블리를 찾으면 그것은 새로운 것을 그대로 사용하지만 그대로 사용하십시오. 이것은 일반적으로 위험하며, 원래의 참조 어셈블리를 잃어 버렸고 새로운 참조 어셈블리가 어느 정도 변경되었는지에 대한 단서가없는 경우에 따라 절전하려고 할 때만이 작업을 수행합니다. 이 설정을 항상 기본값 인 True로 설정하고 빠져 나갈 수없는 깊은 구멍을 파헤 치면 False 만 사용하십시오.

런타임시 정확한 표시 이름과 참조 어셈블리에서 기록한 [AssemblyVersion]을 가진 어셈블리를 항상 찾습니다. 같은 이름과 네임 스페이스를 가진 어셈블리가 두 개있는 경우 일반적으로 extern alias이 필요합니다. ILMerge를 사용하면 실제로 어셈블리의 표시 이름을 변경하는 임시 해결책이 될 수 있습니다. 그러나 여전히 충돌하는 네임 스페이스 + 유형 이름을 남겨 둡니다. 장애물 주위를 항해하는 방법이 명확하지 않습니다.

그래서 전형적인 결과는 EXE가 이름이 변경된 어셈블리 표시 이름을 사용하여 A2를 찾으려고 시도하고 B가 A1을 찾으려고한다는 것입니다. 내가 제공 한 정보에서 100 % 충실한 정보를 얻을 수는 없습니다. 비정상적인 경우에는 Fuslogvw.exe를 사용하여 어셈블리 바인딩 추적을 가져옵니다. "모든 바인드 기록"옵션을 선택하십시오.