1장 CLR의 실행 모델
CLR : 서로 다른 프로그램 언어들 사이에서 공동으로 사용할 수 있는 실행 환경
CLR의 핵심기능
- 메모리 관리
- 어셈블리 로딩
- 보안
- 예외처리
- 스레드 동기화 등
컴파일러가 소스코드 분석, 문법 점검 수행
컴파일러의 Output빌드는 관리모듈 (IL + MetaData)
=어떤 언어를 사용하든 상관없음
소스코드 => 컴파일 => 관리모듈
관리모듈 구성
- PE32/PE32+ (64비트에서만 동작)헤더 : 앱의 타입구분 GUI,CUI, DLL
- CLR 헤더 : 관리 모듈로 취급되기 위한 정보 (필요한 CLR버전, 플래그, 진입(Main)메서드, 메타데이터, 리소스, 각 블록 크기 등
- 메타 데이터 : 2가지 테이블로 구성
- IL코드 : 소스 코드를 컴파일해 만든 코드로 CLR(jit 컴파일러)이 IL을 CPU명령어(기계어)로 컴파일
어셈블리
관리 모듈들 + 리소스 파일의 그룹 (exe, dll 등)
=> 재사용, 보안, 버전관리의 단위(Entity)
이후 관리 모듈들을 하나의 어셈블리로 통합해주는 도구를 통해 어셈블리가 됨
*도구 : C# 컴파일러(CSC.exe, 어셈블리 링커(AL.exe) 등
C:\Windows\Microsoft.NET\Framework\{version}\csc.exe 있다
어셈블리 내의 매니패스트는 어셈블리 안의 파일들의 집합을 설명
메서드를 실행 : IL은 JIT 컴파일러(CLR의 일부)에 의해 기계어(Native Code)로 번역
CTS (Common Type System) : CLR 최상위 개념, 특정 namespace에 묶어서 정리
namespace는 관련있는 타입을 논리적으로 Grouping 한 것
-System.IO, System.Net 등등 using으로 개발자가 사용
COM 컴포넌트 : 모든 실행 모듈에 적용되는 표준. DLL, EXE 등 프로젝트. COM참조에가면 볼수있다.
2장 빌드 패키징 배포
Lib(Static Link Library)
컴파일 시점에 라이브러리가 링커에 의해 연결되어 실행 파일의 일부분이 된다.
DLL(Dynamic Link Library)
실행 파일에서 해당 라이브러리의 기능을 사용 시에만, 라이브러리 파일을 참조하여(혹은 다운로드받아) 기능을 호출한다.
- 정적 링크와는 다르게 컴파일 시점에 실행 파일에 함수를 복사하지 않고, 함수의 위치정보만 갖고 그 함수를 호출할 수 있게 한다.
DLL의 이점
1) 더 적은 리소스 사용
- 한 코드를 여러 프로그램이 동시에 사용하기 때문에 메모리가 절약된다.
- 사용되는 디스크 공간을 줄일 수 있다.
- 운영 체제와 프로그램이 더 빠르게 로드 및 실행되며 컴퓨터에서 디스크 공간을 더 적게 차지한다.
2) 모듈식 아키텍처 활용
- DLL을 사용하면 모듈식 프로그램을 효율적으로 개발할 수 있다.
여러 언어 버전이 필요한 큰 프로그램이나 모듈식 아키텍처가 필요한 프로그램을 개발할 수 있다.
3) 손쉬운 배포와 설치
- DLL 내의 함수를 업데이트하거나 수정해야 하는 경우 DLL을 배포하고 설치할 때 프로그램을 DLL과 다시 연결하지 않아도 된다.
- 여러 프로그램이 같은 DLL을 사용하는 경우에는 모든 프로그램에 업데이트나 수정 내용이 적용된다.
4) 프로그래머들의 분담 작업이 용이하며 재사용성도 뛰어남.
또한 코드의 양이 적어지므로 디버깅도 용이해진다.
3장 어셈블리
어셈블리 -exe, dll 등의 실행 결과물(아직 기계어 아님)
어셈블리 배포 방식
Weakly Named Assembly 공식 명칭은 아니지만 책에서 구분하기 위해 사용
Strongly Named Assembly
구조적으로는 완전히 동일하고, Strongly에서 게시자를 공개키-개인키 쌍으로 구분하여 식별
어셈블리를 well-known 디렉터리에 설치
공유되는 DLL들을 System32 디렉터리 아래로 복사하려고 하기 때문에 덮어 씌워버리는 문제 발생,
이 문제를 해결하기 위해 파일명으로 구분하기만 해도 위험할 수 있기때문에
공개키(RSA)로 식별하게 하는 Strongly Named Assembly를 사용
이 서명과정, 공개키등이 IL, 메타데이터가 있는 관리 모듈에 포함됨 (과정은 생략)
전역 어셈블리 캐시(GAC)
GAC하위로 어셈블리는 well-known 디렉터리에 놓임,
GAC Directory : %SYSTEMROOT% \Microsoft.NET\Assembly
'개발 공부 유니티, C# > 스터디' 카테고리의 다른 글
클린 코드 정리 (0) | 2023.07.03 |
---|---|
제프리 리처의 CLR via C# 2부 타입 설계 part.1 (0) | 2023.06.25 |
Effective C# Chapter 4 (0) | 2023.01.08 |
Effective C# Chapter 3 (0) | 2023.01.05 |
Effective C# Chapter 2 (0) | 2023.01.04 |