[CLR/C#] 빌드, 패키징, 배포, 응용프로그램과 타입의 관리

2024. 4. 15. 21:16·독서/CLR via C#

제프리 리처의 CLR via C#(저자, 제프리 리처)


[CLR/C#] 빌드, 패키징, 배포, 응용프로그램과 타입의 관리


2장 목표


응용 프로그램과 내부의 타입들을 개발하고 패키징한 후, 배포하는 단게에 대해서 학습한다.

 

1. 윈도우의 문제점


윈도우에서 프로그램 실행을 위해서는 동적 링크 라이브러리(DLL, Dynamic Link Library)가 필요하다. 또, 여러 소프트웨어 개발 업체에서 프로그램을 개발하기 때문에 어떤 요인으로 인해서 코드가 정상적으로 실행되지 않거나, 올바른 작동을 하지 않을 확률, 충돌이 생길 확률이 존재한다.

 

하지만, 이러한 문제점을 소프트웨어 개발 업체에서 바로 확인하는 것은 어려운 일이다. 왜? 충돌은 여러 요인에 복합적으로 아우러져 일어날 수 있기 때문이다.

 

이런 확률이 프로그램 사용자에게 나타난다면 사용자는 프로그램의 정상적인 실행을 위해서 DLL을 찾고 찾는 일명 DLL 지옥에 빠질 수 있다.

 

또, 윈도우에서 보안도 쉽지 않은 부분이다. 다수의 소프트웨어 개발 업체에서 개발한 프로그램을 여럿 사용하다 보니, 신뢰할 수 있는 코드뿐만 아니라, 신뢰할 수 없는 코드의 존재 가능성도 생기기 때문이다.

 

2. .Net Framework


위와 같은 문제들로 인해서 MS는 .Net Framework에 코드 액세스 보안(CAS, Code Access Security)이라는 보안 모델을 제시한다. 코드 액세스 보안은 Window Security가 UID를 기반으로 하는 보안 모델을 채택한 것과 달리, 호스트 응용 프로그램이 권한을 설정할 수 있게 하여 로드되는 컴포넌트(=프로그램)들이 어떤 작업을 수행하는지 확인할 수 있는 방법을 사용한다.

 

1번에서 설명한 윈도우의 문제점들은 아래의 내용들을 보이면서 해결할 수 있는 방법들을 소개한다.

 

3. 모듈 안에 타입 만들기


public sealed class Program {
    public static void Main() {
        System.Console.WriteLine("Hello World");
    }
}

 

 

위 코드는 Program 타입을 정의한다. 또, MS에서 Mscrolib.dll 어셈블리를 통해서 제공하는 System.Console 타입을 사용하고 있다. 즉, 직접 구현하는 타입 외로도 다른 회사에서 만든 타입을 사용하고 있는 것이다.

 

코드를 컴파일하고 나타나는 구성에 대해서 이야기해보자.

 

4. Program.exe의 내부 구성


3번 문항의 코드를 컴파일하면 관리 PE인, Program.exe 파일이 생성된다. 관리 PE는 일반적으로 동적 링크 라이브러리(DLL)나 실행 파일(exe)를 의미한다.

 

관리 PE는 네 가지의 주요 파트로 구성되고 내용은 다음과 같다.

 

1. PE/PE32+

윈도우 운영체제에서 실행을 하기 위해 필요한 정보를 담는다.

 

2. CLR

CLR 버전 데이터 정보 및 다른 정보 플래그를 가진다.

 

3. 메타데이터 헤더

메타데이터 테이블들의 크기와 오프셋 값에 대한 정보를 가진다.

 

4. IL

 

위 항목 중, 메타데이터 헤더 영역은 몇 개의 테이블로 구성된 이진 데이터로 되어있다. 테이블은 정의 테이블, 참조 테이블, 매니페스트 테이블로 나눌 수 있다.

 

4.1. 정의 테이블(Definition Table)


정의 테이블은 소스 코드를 기준으로 생성 가능한 정의 테이블을 생성하고 PE 파일에서 데이터를 보관하게 된다.

 

4.2. 참조 테이블(Reference Table)


참조 테이블은 어셈블리, 참조하는 타입, 필드, 메서드, 속성, 등의 다양한 정보를 보관한다.

 

4.3. 매니페스트 테이블(Manifest Table)


어셈블리의 구조나 속성에 대한 주요 정보들을 보관하고 있다. 이를 통해서 어셈블리 간의 관계를 알 수 있으며, 필요한 파일들을 불러올 수 있도록 한다.

 

4.4. 메타데이터 확인


위 코드를 lidasm.exe 프로그램을 통해서 IL 코드 확인 및 메타데이터를 볼 수 있다. 확인 방법은 아래 링크 참고

 

[C#] IL 코드 확인 및 메타데이터 확인하기

[C#] IL 코드 확인 및 메타데이터 확인하기 1. ildasem.exe 파일 실행하기 C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools 위 주소로 이동하여 ildasem.exe 파일을 실행한다. * 주소는 개인마다 다

taeyeokim.tistory.com

 

5. 어셈블리에 대한 설명


어셈블리는 타입에 대한 정의가 담긴 파일과 리소스 파일을 묶은 집합이다. 프로그램 개발 시, 중요한 정보가 포함이 되기 때문에 어셈블리를 구성하는 모듈은 패키지로 만들고 버전 번호를 통해 보안을 견고히 해야한다.

 

앞서 간단한 이해를 위해서 어셈블리를 DLL이나 EXE라고 설명한 바 있으나, 이외의 다른 타입의 어셈블리도 존재한다. 대표적으로는 JPEG, GIF, 등 다양한 리소스 확장자가 존재한다.

 

6. CLR에서의 어셈블리 사용


CLR은 어셈블리를 통해서 매니페스트 메타데이터 테이블을 먼저 읽고 어셈블리 내부에 존재하는 다른 파일을 다루기 위해서 매니페스트를 사용하여 이름을 확인한다.

 

해당 게시글은 책을 기반으로 배운 내용을 간략하게 요약한 것입니다. 
자세한 내용은 제가 참고한 책을 확인해주세요.

'독서 > CLR via C#' 카테고리의 다른 글

[CLR/C#] 타입의 기초  (0) 2024.04.15
[CLR/C#] 공유 어셈블리와 강력한 이름의 어셈블리  (0) 2024.04.15
[C#] IL 코드 확인 및 메타데이터 확인하기  (0) 2024.04.15
[CLR/C#] CLR의 실행 모델 (2)  (0) 2024.02.11
[CLR/C#] CLR의 실행 모델 (1)  (0) 2024.02.10
'독서/CLR via C#' 카테고리의 다른 글
  • [CLR/C#] 타입의 기초
  • [CLR/C#] 공유 어셈블리와 강력한 이름의 어셈블리
  • [C#] IL 코드 확인 및 메타데이터 확인하기
  • [CLR/C#] CLR의 실행 모델 (2)
태역
태역
  • 태역
    RYULAB
    태역
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 언어
        • C
        • C++
        • C#
      • 엔진, 프레임워크
        • Unity
        • Unreal
        • Electron
      • 공부
        • 디자인 패턴
        • 수학
        • CS
        • Git
        • 알고리즘
        • 자료구조
      • 코테
        • 프로그래머스
        • 백준
      • 독서
        • Effective C#
        • CLR via C#
        • 뇌를 자극하는 윈도우즈 시스템 프로그래밍
        • 오브젝트
        • CSAPP
        • OSTEP
      • 프로젝트
        • Unity
      • 개발 일지
        • 퓨처리티
        • 골든타임
      • 활동
        • 게임잼 후기
        • 게임제작동아리 브릿지
        • 크래프톤 정글
        • 기타
      • 기타
  • 블로그 메뉴

    • 링크

    • 공지사항

      • 2024 04 17
    • 인기 글

    • 태그

      오블완
      인프런 #인프런강의후기 #게임개발 #게임개발강의 #인강후기 #강의후기 #게임개발자 #인프런강의
      티스토리챌린지
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    태역
    [CLR/C#] 빌드, 패키징, 배포, 응용프로그램과 타입의 관리
    상단으로

    티스토리툴바