2010-02-05 8 views
4

CLR은 프로그램 시작시 모든 종속 어셈블리를 [반드시로드하지 않아도 되나요?] 해결하려고합니까? 즉, 필요에 따라 종속 어셈블리가 해결됩니까? Assembly.Load * [반사] 종류의로드에 대해 말하는 것이 아닙니다.시작시 CLR 종속 어셈블리 해상도

답변

4

IL을 기계어로 변환하면 어셈블리로드를 지시하는 JIT 컴파일러입니다. 형식 메서드 호출은 먼저 스텁 함수를 호출하기 위해 변환됩니다. 이 스텁은 호출 될 때 JIT 컴파일러를 활성화하여 IL (필요한 경우 어셈블리를로드 함)을로드하고 변환합니다. 매우 많은 주문형.

이 프로세스의 주름은 Ngen.exe를 통해 실행 된 어셈블리입니다. 모든 .NET Framework 어셈블리는 컴퓨터에 설치되었을 때의 어셈블리였습니다. 어셈블리가 처음로드 될 때 감지됩니다. 그런 다음 JIT 컴파일러는 변환 단계를 건너 뛰고 사전 변환 된 기계 코드를있는 그대로 사용합니다. 어셈블리에서 생성 된 모든 기계 코드가로드되지만 여전히 주문형입니다. "로드"라는 용어는 여기에서 상대적입니다. Windows는 메모리 매핑 된 파일을 사용하여 기본 이미지를 가상 메모리 공간에 매핑합니다. 코드 실행이 아직 RAM에 매핑되지 않은 메모리 페이지에 도착할 때까지 실제 바이트는 파일에서 읽지 않습니다. 이 기술 용어는 "페이지 오류"이며 Taskmgr.exe에서 볼 수 있습니다.

3

해당 어셈블리에 정의 된 형식이 필요할 때 종속 어셈블리가 확인됩니다. 따라서 어셈블리는 필요할 때로드됩니다.

3
here

CLR을 로더로드에서

및 초기화 적은 멀리로 얻을 수있다. Win32 로더와 달리 CLR 로더는 해결되지 않고 하위 모듈 모듈 (또는 어셈블리)을 자동으로로드합니다. 오히려 하위 항목은 실제로 이 필요한 경우에만 (Visual C++ 6.0의 지연로드 기능과 마찬가지로) 요청에로드됩니다. 이것은 뿐만 아니라 프로그램 초기화 시간을 까지 증가시킬뿐만 아니라 실행중인 프로그램에 의해 소비 된 리소스의 양을 줄입니다.