|
|
|
|
|
닷넷 프레임워크는 2002년에 마이크로소프트에서 발표한 응용 프로그램 개발 환경으로서 프로세스 가상 머신에 속한다. 일반적인 네이티브 언어로 만들어진 프로그램들이 운영체제에서 곧바로 실행되는 것과는 달리, 닷넷 프레임워크를 기반으로 만들어진 응용 프로그램은 반드시 닷넷 프레임워크가 미리 설치된 환경에서만 실행된다.
|
|
|
|
|
|
닷넷 프레임워크를 설치하면 가상 머신 역할을 하는 CLR(Common Language Runtime) 구성요소가 실행될 수 있는 환경이 윈도우 운영체제에 마련된다.
|
|
|
|
|
|
가상머신 CLR에서 실행될 수 있는 언어를 CIL(Common Intermediate Language) 또는 IL 라고 하며 IL로 변역되는 언어를 닷넷 호환 언어(.NET-Compliant Language)라고 한다. 마이크로소프트에 의해 공식적으로 제공되는 닷넷 호환 언어는 C#, Visual Basic, .NET, F#, C++/CLI가 있다.
|
|
|
닷넷 프레임워크를 설치하면 가상 머신 역할을 하는 CLR(Common Language Runtime) 구성요소가 실행될 수 있는 환경이 윈도우 운영체제에 마련된다. 가상머신 CLR에서 실행될 수 있는 언어를 CIL(Common Intermediate Language) 또는 IL라고 하며 IL로 변역되는 언어를 닷넷 호환 언어(.NET-Compliant Language)라고 한다. 마이크로소프트에 의해 공식적으로 제공되는 닷넷 호환 언어는 C#, Visual Basic, .NET, F#, C++/CLI가 있다.
|
|
|
|
|
|

|
|
|
|
|
|
위의 그림을 보면 C#컴파일러는 CLR를 로드하는 코드와 C#소스코드를 기계어가 아닌 IL코드로 EXE/DLL파일 내부에 생성한다. 따라서 사용자가 C#으로 개발된 애플리케이션을 실행하면 내부적으로 CLR이 먼저 로드된다. 이어서 CLR은 EXE 파일 내에 있는 IL코드를 로드해서 실행시킨다.
|
|
|
|
|
|
#### CLR
|
|
|
#### **CLR**
|
|
|
CLR는 두 가지 큰 기능이 있는데, 하나는 CIL를 JIT컴파일러를 이용해 기계어로 변환하는 것이고, 다른 하나는 GC(Garbage Collector)를 제공해 동적 메모리 할당 및 회수를 지원하는 것이다. CLR의 JIT(Just In Time compilation)은 CIL파일이 정상인지 판단하고 Runtime 시 사용하는 native코드를 IL코드로 변환 후 호출한다. JIT은 지속적으로 보안, 메모리 관리, 쓰레드와 같은 부분을 Runtime 시 지속적으로 관리한다.
|
|
|
|
|
|
프로그램 실행 중 CLR는 다음과 같은 기능을 한다.
|
... | ... | @@ -21,18 +19,18 @@ CLR는 두 가지 큰 기능이 있는데, 하나는 CIL를 JIT컴파일러를 |
|
|
**6. Verification & Compilation**
|
|
|
**7. Garbage Collector**
|
|
|
|
|
|
#### 공통 중간 언어(CIL: Common Intermediate Language)
|
|
|
#### **공통 중간 언어(CIL: Common Intermediate Language)**
|
|
|
자바의 VM에서는 중간 언어를 특별히 바이트 코드(Byte Code)라고 한다. 이와 마찬가지로 닷넷의 CLR에서는 이를 CIL이라고 하며 보통은 줄여서 IL코드 또는 MSIL코드라고 한다. 이는 CPU에 독립적인 결과물로서 모든 닷넷 호환언어는 소스코드를 IL 코드로 컴파일하고 CLR이 실행될 때 IL코드를 CPU의 기계어로 최종 번역한다. IL코드에는 자체적인 프로그래밍 문법이 있으며 ILASM.EXE라는 전용 컴파일러도 있다. IL코드는 가상 머신에서 실행된다는 의미에서 일종의 기계어와 유사하다.
|
|
|
|
|
|
#### 공통 타입 시스템(CTS: Common Language Specification)
|
|
|
#### **공통 타입 시스템(CTS: Common Language Specification)**
|
|
|
닷넷 호환 언어가 지켜야 할 타입(Type)의 표준 규격을 정의한 것이 공용 타입 시스템이다. 예를 들어 CTS에서는 클래스의 상속을 하나만 받을 수 있도록 정의하고 있다. 따라서 직접 닷넷 호환 언어를 만든다면 클래스의 다중 상속을 지원하도록 만들 수는 없다. 즉, 닷넷 호환 언어는 CTS의 한계를 넘어서 구현할 수 없다.
|
|
|
|
|
|
#### 공용 언어 사양(CLS: Common Language Specification)
|
|
|
#### **공용 언어 사양(CLS: Common Language Specification)**
|
|
|
닷넷 호환 언어가 지켜야할 최소한의 언어 사양을 정의한 것이다. CTS 전체를 구현할 필요는 없지만 CLS에 명시된 사양만큼은 완벽하게 구현해야 한다. 닷넷 호환 언어끼리는 서로 사용할 수 있고 상속을 받을 수 있다. 이 경우에는 CLS를 만족 시키도록 작성해야 한다는 것이다.
|
|
|
|
|
|

|
|
|
|
|
|
#### 공용 언어 기반구조(Common Language Infrastructure)
|
|
|
#### **공용 언어 기반구조(Common Language Infrastructure)**
|
|
|
|
|
|
CLI는 CTS 명세를 포함하며 중간 언어에 대한 코드 정의, Metadata와 그것을 포함하는 이진파일의 구조까지 표준 사양으로 기술하고 있다. CLI 규격을 마이크로소프트에서 구현한 실체가 바로 CLR이다. 또한 마이크로소프트에서는 CLI를 외부에서도 쉽게 구현할 수 있게 최소한의 코드로 CLI를 구현한 SSCLI(Shared Source CLI)를 함께 공개했다. 그 외에 모노(Mono) 프레임워크라는 또 다른 CLI 구현체가 오픈소스로 꾸준히 개발되고 있으며 이 프레임워크는 리눅스, iOS, 안드로이드까지 지원하고 있다.
|
|
|
|
... | ... | @@ -43,7 +41,7 @@ CLI는 4가지 구성요소로 나뉜다. |
|
|
**3. Metadata :** Metadata는 어셈블리에 정의된 모든 클래스와 클래스 멤버에 대한 정보를 제공한다.
|
|
|
**4. Virtual Execution System (VES) :** VES는 Metadata를 사용하는 CLI와 호횐되는 프로그램을 구동시킨다. CLI는 virtual operation system에 대한 명세서이며 구현된 virtual operation system이 CLR이다.
|
|
|
|
|
|
#### 어셈블리
|
|
|
#### **어셈블리**
|
|
|
** 어셈블리 :** c#으로 프로그램을 하는 경우 대개 EXE 또는 DLL 파일을 만들게 된다. 닷넷에서는 이러한 실행파일을 어셈블리(Assembly)라고 한다. 닷넷에서 특별한 언급이 없다면 어셈블리는 실행 파일(EXE, DLL)을 의미한다.
|
|
|
|
|
|
** 매니페스트 : ** JIT 컴파일러가 어셈블리의 IL코드를 기계어 코드로 컴파일하는 과정에서 어떤 Class타입이 현재 어셈블리내에 정의되어 있는지 정의되어 있지 않다면 다른 어셈블리의 정보를 얻는다. 이 참조 어셈블리의 정보가 있는 곳이 메니페스트(Menifest)이다. 메니페스트를 포함하고 있지 않은 모듈은 보통 확장자가 netmodule이다. 매니페스트를 포함하는 경우에는 확장자가 DLL(또는 EXE)이다.
|
... | ... | @@ -52,15 +50,15 @@ CLI는 4가지 구성요소로 나뉜다. |
|
|
|
|
|

|
|
|
|
|
|
#### Managed code
|
|
|
#### **Managed code**
|
|
|
Managed code는 Visual Studio 2003버전이 발표되면서 MS에서 만들어낸 개념이다. 일반적으로 Managed code란 VB .NET 또는 C#컴파일러가 생성한 코드이다. 컴파일러를 통해서 컴파일 된 Managed Code는 컴퓨터에서 바로 실행할 수 없는 IL이다. 이 IL은 CLR기반에서 실행이 된다. VB .NET과 C#은 Managed Code만 생성이 가능하다. 하지만 VC++은 Managed Code와 Unmanaged Code를 둘다 만들 수 있다.
|
|
|
|
|
|
#### unmanaged code
|
|
|
#### **Unmanaged code**
|
|
|
unmanaged code는 Visual Studio .Net 2002가 릴리즈 되기 이전의 코드를 말하는데, 이는 VB 6.0 등에서 사용된 코드이다. unmanaged code는 코드라 바로 Machine Code로 컴파일되고, 컴파일한 Machine 과 동일한 칩을 사용하는 환경에서만 실행이 가능하다. unmanaged code는 보안, 메모리 관리 등에 대해서 컨트롤 하지 않는다.
|
|
|
|
|
|

|
|
|
|
|
|
#### .NET Framework
|
|
|
#### **.NET Framework**
|
|
|
CLR의 기능만으로는 응용 프로그램을 작성하는 개발자를 만족시킬 수 없다. 마이크로소프트는 CLR말고도 여러 가지 구성 요소를 함께 만들어 이를 하나의 패키지로 묶어 배포하는데, 이것이 바로 우리가 자주 들었던 "닷넷 프레임워크"로서, 간단히 줄여 "닷넷"이라고 표현한다. 닷넷 프레임워크는 **"닷넷 프레임워크 = CLR + 부가 구성 요소"** 라고 간단히 정의할 수 있다.
|
|
|
|
|
|
부가 구성 요소 | 설명
|
... | ... | @@ -69,12 +67,12 @@ BCL(Base Class Library) | 마이크로소프트는 특정 기능을 수행하는 |
|
|
부가적인 실행파일 | 마이크로소프트는 닷넷 프레임워크에 기본적으로 C#, VB.NET 컴파일러를 제공하고 있으며, 그 외에도 각종 유틸리티 성격의 실행 파일을 포함시켜뒀다.
|
|
|
GAC(Global Assembly Cache) | GAC는 컴퓨터에서 실행되는 닷넷 응용 프로그램이 어셈블리 파일을 공통적으로 찾을 수 있는 전역 저장소다. 일반적으로는 C:\Windows\assembly 폴더에 위치하고 각종 DLL 파일을 담고 있다.
|
|
|
|
|
|
#### C#버전, .Net Framework 버전, Visual Studio 버전 간의 상관 관계
|
|
|
#### **C#버전, .Net Framework 버전, Visual Studio 버전 간의 상관 관계**
|
|
|
|
|
|

|
|
|
2015년 7월 20일 비주얼 스튜디오 2015와 함께 닷넷 4.6, C# 6.0이 발표됐다.
|
|
|
|
|
|
#### 참고자료, 이미지 출처
|
|
|
#### **참고자료, 이미지 출처**
|
|
|
https://en.wikipedia.org/wiki/.NET_Framework
|
|
|
http://guslabview.tistory.com/56
|
|
|
http://egloos.zum.com/duckii/v/1293394
|
... | ... | |