.NET 런타임/Fusion이 항상 매니페스트에서 참조된 어셈블리를 모두 로드하지 않는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/9009330

  •  14-11-2019
  •  | 
  •  

문제

이 모든 것은 내가 노력하고 있기 때문에 시작되었습니다 FxCop 내 어셈블리를 분석합니다. 크리스탈 리포트.그럴 때마다 FxCop은 "라는 어셈블리에 대한 참조를 찾을 수 없습니다.BusinessObjects.Licensing.KeycodeDecoder".이 .dll을 찾으려고 노력하면서 그것이 전혀 존재하지 않는다는 것을 깨달았습니다...하드 드라이브에 없거나 GAC, 아직 내 응용 프로그램 자체는 제대로 실행되고 보고서를 표시합니다.

그래서 사냥을 하게 됐는데...

에서 CrystalDecisions.CrystalReports.Engine.dll 파일을 열면 ILDASM, 매니페스트에 참조가 포함됩니다.

.assembly extern BusinessObjects.Licensing.KeycodeDecoder
{
  .publickeytoken = (69 2F BE A5 52 1E 13 04 )                         // i/..R...
  .ver 13:0:2000:0
}

그러나 Fusion Logger(fuslogvw)를 열고 애플리케이션을 실행하면 Fusion이 다음을 포함하여 여러 Crystal 어셈블리를 로드하는 것을 볼 수 있습니다. CrystalDecisions.CrystalReports.Engine, 그러나 참조된 BusinessObjects.Licensing.KeycodeDecoder 조립은 시도조차 해본 적 없는 로드됩니다.

그래서...왜?.NET 런타임은 런타임 시 해당 참조를 건너뛰거나 로드하지 않는 것을 어떻게 알 수 있습니까?Fusion이 참조된 모든 어셈블리를 재귀적으로 로드하지 않는 이유는 무엇입니까?나는 단지 그 뒤에 숨은 논리나 추론, 디자인 의도를 찾고 있을 뿐입니다.

마찬가지로 중요한 점은 .dll에 대한 참조가 있지만 해당 참조가 적용되지 않는 .NET 프로젝트를 만들 수 있는 이유는 무엇입니까?IMO, 그건 틀렸어 수액 설치되지도 않은 다른 어셈블리를 참조하는 Crystal 어셈블리를 제공할 수 있습니다.

도움이 되었습니까?

해결책

순전히 수요에 적재됩니다.매니페스트는 올바른 어셈블리 (올바른 버전, 강력한 이름 등)를 찾는 데 사용됩니다.

아무도 어셈블리에서 타입을 요청하지 않는 한, 그것을로드 할 이유가 없습니다.Assemblies는 구성 파일의 어셈블리 규정 유형 이름을 통해 클래스의 Type를 가져 오는 데만로드 될 수 있습니다.

다른 팁

실제로 사용될 때만 어셈블리 만 넣을 것입니다.따라서 어셈블리 내부의 코드가 실제로 실행되지 않으면 어셈블리가로드되지 않거나로드하려고 시도하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top