.NET 런타임/Fusion이 항상 매니페스트에서 참조된 어셈블리를 모두 로드하지 않는 이유는 무엇입니까?
-
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
를 가져 오는 데만로드 될 수 있습니다.
다른 팁
실제로 사용될 때만 어셈블리 만 넣을 것입니다.따라서 어셈블리 내부의 코드가 실제로 실행되지 않으면 어셈블리가로드되지 않거나로드하려고 시도하지 않습니다.