닷넷 관련 키워드 정리
## .NET Framework
.NET Framework(이하 닷넷)는 MS에서 2000년에 발표한 응용 프로그램 개발 환경이다. 닷넷은 각종 응용 프로그램을 작성 및 실행 해주는 걸 도와줌으로써 개발자가 응용 프로그램의 비즈니스 코드에만 집중할 수 있게 도와준다.
닷넷은 다양한 운영체제에서 작동하는 호환성을 목표로 만들어졌다. 그래서 중간 언어와 JIT 컴파일러를 통해 플랫폼 독립성을 확보하고 언어의 상호 운용이 가능하다는 장점이 있지만 그와 동시에 2번의 컴파일을 거치기 때문에 속도가 떨어진다는 단점이 공존한다. 닷넷을 기반으로 만들어진 응용 프로그램들은 닷넷이 미리 설치된 환경에서만 작동한다.
닷넷의 계층구조는 다음과 같다.
이 그림을 간단히 설명하자면 닷넷은 CLR + 부가 구성요소로 되어있다. 주요 부가 구성요소는 다음과 같다.
- BCL(Base Class Library)
MS에서 특정 기능들을 바로 쓸 수 있게 구현해 놓은 클래스들이다. 아래는 BCL에 포함된 클래스의 목록과 기능들이다.- 기본 타입에 대한 정보 제공
- 배열, 연결리스트 , 큐 등의 컬렉션 클래스
- 스레드와 동기화 클래스
- 각종 컨트롤
- 파일 입출력
- 네트워크 프로그래밍
- 데이터베이스 액세스
- 실행파일
닷넷은 기본적으로 C#, VB.NET의 컴파일러를 제공하고, 각종 유틸리티 성격의 실행 파일을 포함하고 있다. - GAC(Global Assembly Cache)
컴퓨터에서 실행되는 닷넷 프로그램들이 쓸 수 있는 어셈블리 파일을 저장하고 있는 전역 저장소이다.
## CLR(Common Language Runtime) 직역하자면 공용 언어 런타임이라는 뜻인데 닷넷 실행 엔진을 의미한다. 자바의 가상 머신(JVM)과 개념적으로 동일하다. CLR은 닷넷 프로그램 실행에 필수적인 런타임들의 집합이되 이름이 의미하듯이 모든 언어에 공용으로 사용된다. 어떤 언어로 만든 프로그램이든지 IL을 JIT으로 컴파일한 후 CLR과 연결되므로 제작 언어에 상관없이 CLR의 서비스를 받을 수 있다.
CLR은 닷넷의 핵심 커널이다. 응용 프로그램이 실행되면 CLR이 권한을 확인하고 프로세스를 생성하며 코드의 안전성을 검사한다. 보안 점검이 완료되면 첫 번째 스레드를 생성하여 응용 프로그램의 코드를 실행시킨다. 실행 중에 응용 프로그램의 요청을 받아 때로는 직접 처리하기도 하고 때로는 호스트 운영체제와 통신을 주선하기도 한다. CLR은 운영체제와 닷넷 응용 프로그램 사이에 위치하며 한마디로 닷넷 프로그램 실행을 위한 모든 서비스를 제공하는 실행 주체라고 할 수 있다.
닷넷 응용 프로그램은 운영체제와 직접 통신하지 않으며 반드시 CLR을 거쳐야 한다. CLR은 물론 플랫폼별로 따로 제공된다. CLR이 호스트 운영체제와의 통신을 책임지므로 응용 프로그램은 운영체제에 대해서 독립적이다. 응용 프로그램은 호스트 운영체제는 거의 신경 쓸 필요가 없고 오로지 CLR과의 약속만 잘 지키면 된다.
JIT 컴파일러?
managed code의 소스코드는 각 언어의 컴파일러에 의해서 IL코드와 실행에 필요한 정보들을 갖고 있는 메타데이터로 이루어진 managed module로 생성 된다.
이 모듈이 실행될 경우 JIT컴파일러에 의해 실행에 필요한 부분이 곧바로 Native code로 컴파일되어 실행된다. 당연히 매번 실행시마다 JIT컴파일러에 의해 컴파일되어 실행되는 것은 아니고 한번 컴파일 된 부분은 재 사용하는 등의 최적화 과정을 통해 CLR의 코드는 실행된다.
동적 메모리 관리는 CLR 내의 가비지 컬렉터가 담당한다. C 또는 C++로 프로그래밍을 하다보면 메모리 관리때문에 복잡한 경우가 많은데, C#에서는 가비지 컬렉터가 메모리 관리를 대신해주기 때문에 편하게 프로그래밍을 할 수 있다.
하지만 이 가비지 컬렉터 또한 CPU와 메모리를 사용하기 때문에 가비지 컬렉터가 최소한으로 자원을 사용하게 한다면 프로그램의 성능을 높일 수 있다.
CTS(Common Type System)
CTS는 모든 닷넷 언어들이 공동으로 사용하는 타입 체계를 정의한다. 언어끼리 함수를 호출하려면 인수나 리턴값에 대해 서로의 타입을 알 수 있어야 한다. 예를 들어 C++에서 int 형의 값을 넘기면 VB에서는 Integer 타입으로 이 값을 받아들일 것이다. 이때 int와 Integer는 같은 타입이라는 것을 두 언어가 모두 알고 있어야 하며 물리적인 포맷이 같아야 한다. 두 타입의 길이나 형태가 다르다면 서로 다른 언어끼리 원활하게 통신할 수 없을 것이다.
함수 호출뿐만 아니라 다른 언어가 정의한 객체를 포함한다거나 다른 언어가 정의한 클래스를 상속받을 때도 똑같은 문제가 있다. 진정한 언어 독립성을 확보하고 언어간의 교차 프로그래밍이 가능하기 위해서는 개별 언어가 타입을 마음대로 정의해서는 안되며 플랫폼 차원에서 공통의 타입을 정의할 필요가 있는데 이 타입 체계가 바로 CTS이다.
CTS는 닷넷 지원 언어들이 공동으로 사용하는 타입에 대한 약속이며 IL에서 사용 가능한 타입들의 집합이다. CTS에는 정수, 실수같은 기본형 뿐만 아니라 클래스, 배열 같은 좀 더 복잡한 타입까지 계층이 잘 정의되어 있다.
CTS는 값 타입(Value Type)과 참조 타입(Reference Type)의 2가지로 나눌 수 있다.
값 타입? 참조타입?
- 값 타입 : 값을 변수에 넣는 데이터 형식 -> 스택에 저장
- 참조 타입 : 변수에 대한 위치(메모리 위치)를 담는 데이터 형식 -> 힙과 스택에 저장. 가비지 컬렉팅이 일어나는 원인!
CLI, CTS, CLS, CLR의 관계도
## 어셈블리(Assembly) 어셈블리는 닷넷에서의 실행파일(주로 EXE, DLL 파일)을 말한다.
어셈블리는 1개 이상의 모듈로 구성되는데, 모듈 하나당 한 개의 파일이 대응된다. 하지만 여러개의 파일이 어셈블리를 구성한다면 이 파일들의 목록을 관리하는 데이터가 필요하다. 그 때문에 이 모듈 중의 하나는 다른 모듈의 목록을 관리하는 매니페스트(Manifest) 데이터를 갖고있다. 매니페스트를 포함하고 있지 않은 모듈은 확장자가 netmodule이고, 매니페스트를 포함하는 경우에는 확장자가 DLL(또는 EXE)이다.
EXE 와 DLL의 차이
DLL의 내부에 구현된 API는 외부에서 참조 할 수 있지만 EXE는 불가능하다. 그래서 재사용 가능한 코드는 컴파일해서 DLL 파일에 모아두고 서로 다른 EXE에서 공유해서 사용하는 방식이 일반적이다.
## Managed VB.NET 또는 C# 등의 소스코드가 컴파일러를 거친후 IL 코드로 변환되고, IL 코드가 CLR을 통해 실행되는데 이 프로세스를 **Managed Process**라고 한다. 또한 CLR자체를 **Managed Environment**라고 하며, 닷넷 호환 언어 역시 기존의 언어와 구분하는 의미에서 **Managed Language**라고 한다.
Managed Process를 그림으로 나타내면 다음과 같다.
## Unmanaged Managed와 달리 IL코드 같은 중간 언어를 거치지 않고 컴파일 이후 바로 실행이 되는 머신 코드를 만들어 내는 것을 말한다. 때문에 속도에 장점을 가진다.
Unmanaged Process를 그림으로 나타내면 다음과 같다.
각 버전 간의 상관 관계
C#은 닷넷을 위해 만들어진 언어이다. 그래서 C#과 닷넷은 같이 발전한다. 또한, 관련 도구인 Visual Studio도 같이 업데이트 된다.
C#, Visual Studio, 닷넷과의 버전 간의 상관 관계는 다음과 같다.
날짜 | C# 버전 | .NET 버전 | Visual Studio 버전 |
---|---|---|---|
2002년 1월 | C# 1.0 | .NET Framework 1.0 | Visual Studio .NET 2002 |
2003년 4월 | C# 1.2 | .NET Framework 1.1 | Visual Studio .NET 2002 |
2005년 11월 | C# 2.0 | .NET Framework 2.0 | Visual Studio 2005 |
2007년 11월 | C# 3.0 | .NET Framework 2.0~3.5 | Visual Studio 2008~2010 |
2010년 4월 | C# 4.0 | .NET Framework 4.0 | Visual Studio 2010 |
2012년 8월 | C# 5.0 | .NET Framework 4.5 | Visual Studio 2012~2013 |
2015년 7월 | C# 6.0 | .NET Framework 4.6 | Visual Studio 2015 |
2017년 3월 | C# 7.0 | .NET Framework 4.6.2 | Visual Studio 2017 |
질문내용
- GAC의 실체 확인
GAC이란 Global Assembly Cache의 약자이며 닷넷 어셈블리를 닷넷 프로그램들 전체에서 공유하여 사용할 수 있는 저장소를 말한다. GAC은 Windows 폴더의 assembly라는 폴더에 있는데, GAC에 .NET 어셈블리를 설치하기 위해서는 gacutil.exe 같은 유틸리티를 사용한다. GAC에 있는 어셈블리가 우선순위를 가지기 때문에 실행 프로그램의 폴더에 DLL이 있고, 같은 DLL이 GAC에 있다면, GAC의 DLL이 실행된다.
- 안전성의 의미
Managed code를 사용하면 CLR이 타입의 안정성, 메모리 관리와 가비지 컬렉션 등을 해준다. 메모리 관리와 가비지 컬렉션은 메모리 누수와 이와 관련된 이슈를 줄여준다. 타입의 안정성은 CTS의 체계 안에서 다양한 언어간의 상호 운용성을 보장하는 것이다.
- 보안 점검의 의미
CLR은 코드에 수행 권한이 있는 작업만 수행하도록 허용한다. 네트워크를 통해 다운로드하는 코드에 대해 보안 점검을 실행한다. 어셈블리가 로드될 때 CLR은 어셈블리에 대한 증거를 수집한다. 증거는 다운로드 위치와 어셈블리 작성자에 대한 정보 등이다. CRL은 이 증거를 통해서 어셈블리가 실행될 컴퓨터의 관리자나 사용자가 설정한 보안 정책에 맞게, 어셈블리에 부여될 권한을 결정한다. 이 권한은 어셈블리의 코드에서 수행할 수 있는 작업과 할 수 없는 작업을 결정하는데 사용된다.
- OS 별 닷넷 지원 범위
운영체제 | 설치된버전 | 설치가능버전 |
---|---|---|
Windows 10 | .NET Framework 4.6 | .NET Framework 4.6.1 ~ 4.6.2 / 3.5 |
Windows 8.1 | .NET Framework 4.5.1 | .NET Framework 4.6 ~ 4.6.2 / 4.5.2 / 3.5 |
Windows 8 | .NET Framework 4.5 | .NET Framework 4.6 ~ 4.6.1 / 4.5.1 ~ 4.5.2 / 3.5 |
Windows 7 | .NET Framework 3.5 | .NET Framework 4.6 ~ 4.6.2 / 4.5 ~ 4.5.2 / 4 / 3.5 / 2.0 |
Windows Vista | .NET Framework 3.0 | .NET Framework 4.6 / 4.5 ~ 4.5.2 / 4 / 3.5 / 2.0 |
Windows XP | -- | .NET Framework 4 / 3.5 / 2.0 |
- 닷넷 하위호환성
닷넷 상위 버전에서는 하위 버전에서 컴퍼일 한 프로그램을 실행 할 수 있다. 다만 별도의 설정이 필요하다. 설정 방법은 다음과 같다.
실행하고자 하는 파일과 같은 폴더에 [실행파일.exe.config] 파일에서 다음과 같이 supportedRuntime을 추가하면 된다.
<?xml version="1.0"?>
<configuration>
<startup>
<supportedRuntime version="v4.0.30319"/>
<supportedRuntime version="v2.0.50727"/>
</startup>
</configuration>
표기된 supportedRuntime은 순서대로 우선순위를 갖는다.
윈도우 8, 10에서 닷넷 3.5를 사용한 어플리케이션을 구동하는 방법
다음과 같은 방법을 거치면 된다. 명령 프롬프트를 통한 설치 이외의 방법들은 인터넷에 연결해야 가능하다.
* 설치 닷넷 3.5가 컴퓨터에 설치돼있지 않다면 다음과 같은 설치 요구 창이 나타난다. **이 기능 설치**를 선택하여 설치하면 된다.

-
닷넷 3.5 설치 관리자 다운로드
MS에서 제공하는 닷넷 3.5 설치 관리자이다. 위 링크로 들어가서 다운로드 받으면 된다.
- 명령 프롬프트를 통한 설치
오프라인 상태이고, 윈도우 설치 미디어가 있다면 명령 프롬프트를 관리자 권한으로 실행 후 다음과 같이 입력하면 된다.
Dism /online /enable-feature /featurename:NetFX3 /All /Source:[설치 미디어 드라이브]:\sources\sxs /LimitAccess
- 그 외의 윈도우 8, 8.1 닷넷 3.5 설치 오류
윈도우 8, 8.1에서 위 방법을 모두 사용했는데 닷넷 3.5가 설치되지 않을 때 사용하는 방법이다.
프로그램 추가 제거 - 설치된 업데이트 보기 - 업데이트 'KB2966826' , 'KB2966828' 검색 후 삭제 - 설치 시도 - 설치
삭제한 업데이트는 설치 후 업데이트를 통해 다시 다운로드가 가능하다.