일단
.NET의 가장 중요한 두가지 특징에 대해 살펴보면
1. 모든 .NET언어가 동일한 .NET 기능에 엑세스 한다는것
2. 다양한 언어로 작성된 코드가 밀접하게 상호 운용된다는 점


이런 기능을 지원하는 일등공신은 MSIL인데, .NET 컴파일러는 소스코드등을 통해 Windows PE가 아닌 MSIL을 생성한다

MSIL의 등장으로 .NET 응용프로그램은 표준적이고 공통적인 포맷으로 컴파일되므로
일관성있게 .NET 런타임 환경에서 운용된다.

.NET 응용프로그램을 컴파일하고 실행할때 어떤일이 발생할까?

1. .NET 언어를 사용해 소스코드를 작성
2. 소스코드는 컴파일되 EXE파일로 작성
3. .NET 컴파일러는 MSIL 코드와 메니페스트를 생성하고 이 정보를 EXE의 한부분으로 포함시킨다.
    .NET 컴파일러가 생성하는 EXE는 기타 EXE와 마찬가지로 표준 PE헤더를 포함하고 있다.
    (메니페스트는 .NET 바이너리의 내용과 런타임 요구사항에 대한 정보를 포함하고 있다.
     메니페스트는 .NET 바이너리 파일에 저장되는 정보를 언급한다. )
4. (가장중요한단계) 컴파일러가 산출물을 생성할 때 .NET 런타임에서 _CorExemail이라는 이름의 함수를 임포트 한다.
5. 사용자가 응용프로그램을 실행하면 운영체제는 PE파일과 관련된 DLL 파일들을 로드한다.
    이 DLL 중에는 _CorExeMail 함수가 정의되어 있는 mscoree.dll 파일들이 포함된다.
    이 파일은 모든 .NET PE 파일이 실행될때 로드된다.
6. 운영체제 로더는 PE내 진입점(entry point)으로 점프한다.(휘릭~) 모든 PE는 Windows에서 이런 프로세스에
   따라 진행된다.
7. 운영체제에서 MSIL 코드를 실행할 수 없기 때문에 진입점은 mscoree.dll의 _CorExeMail으로 점프하는
   루틴에 불과하다.
8. _CorExeMail 함수는 컴파일러에서 PE에 놓아 둔 MSIL코드를 실행한다.
9. MSIL코드는 직접 실행될수 없다.(실행가능한 형식이 아니므로. )
    따라서 CLR에서 JIT 컴파일러를 사용해 MSIL을 CPU전용 명령어로 컴파일한다.
    JIT 컴파일러에서 컴파일할 때 프로그램의 메서드로만 호출되며, 컴파일된 실해오드는 시스템에 임시로
    저장되고 소스코드가 별경될때만 재컴파일 된다.

출처 : INSIDE C#
by 피요히코~ 2009. 4. 22. 23:54