본문 바로가기
IT 지식 개발

.NET 어셈블리 구성요소

by 관리자 2019. 8. 21.

.NET 어셈블리 여러종류의 구성요소를 알아보겠습니다!

 

첫번째 구성요소로 어셈블리 매니페스트가 있습니다. 어셈블리 매니페스트는 어셈블리의 버전 요구사항과 보안ID를 지정하는 데 필요한 모든 메타데이터와 어셈블리의 범위를 정의하고 참조를 확인하는데 필요한 모든 메타데이터를 포함하고 있습니다. 어셈블리 매니페스트는 어셈블리 이름, 버전번호, 문화권, 강력한 이름의 정보, 어셈블리에 포함된 파일 목록, 형식 참조정보로 구성됩니다. 그리고 어셈블리에 정의된 형식들에 대한 형식 메타 데이터와 실제 수행해야 할 코드인 MSIL과 리소스로 구성됩니다.

어셈블리는 하나의 물리적 바이너리로 되어 있는 단일 파일 어셈블리와 여러 개의 물리적 바이너리로 되어있는 다중 파일 어셈블리로 나눌 수 있습니다. .NET에서는 어셈블리의 부속이 될 수 있는 모듈을 만들 수 있게 제공하고 있는데 모듈은 어셈블리에 포함됩니다. 즉, 하나의 어셈블리가 다른 어셈블리에 있는 형식을 사용하기 위해서는 단순히 사용할 어셈블리를 참조만 하면 되는데 모듈에 있는 것을 사용할 때는 모듈을 포함하여 어셈블리를 만들어야 합니다. 그리고 .NET 어셈블리를 구성하는 물리적 바이너리에는 리소스 파일, 매니페스트, DLL, 모듈 등이 있습니다.

 

 

1. 어셈블리 만들어 보기

.ENT 어셈블리 중에 라이브러리를 만들어 보겠습니다. 다중 파일 어셈블리의 부속이 되는 모듈도 만들어보겠습니다.

1) 라이브러리 제작

.NET 에서 라이브러리는 쉽게 제작할 수 있습니다. 코드를 작성하는 부분에서 다른 어셈블리에서 사용하는 형식을 정의할 때 , public 키워드를 명시하면 됩니다. 멤버도 마찬가지로 다른 어셈블리에서 접근을 허용하게 하려면 접근 지정을 public 으로 하면 됩니다.

즉, 다른 어셈블리에 정의된 형식이나 멤버 중에 사용할 수 있는 형식과 멤버는 접근 지정이 public 으로 되어 있다는 것 말고는 차이가 없습니다. COM과 Win32API에서 복잡하고 까다로운 표현을 접근 지정자로 간단하게 해결했습니다.

public class Memeber

{

  ...중략

   public Member(string name, string addr)

   {

      ... 중략

    }

}

 

모듈
어셈블리의 구성요소들은 모듈(module)이라고 부르는 중간 수준 컨테이너들로 조직화됩니다. 하나의 모듈은 어셈블리의 구성요소들을 담은 하나의 파일에 대응됩니다. 중간 수준의 컨테이너들을 두는 이유는 하나의 어셈블리를 여러 개의 파일로 구성할 수 있게 하기 위한 것입니다. 이러한 능력은 다양한 프로그래밍 언어로 작성된 코드를 컴파일한 결과를 담은 어셈블리를 구축할 때 유용합니다. 보통의 경우 즉 어셈블리가 하나의 모듈로 이루어진 경우를 보여주고 여러 모듈로 이루어진 다중 파일 어셈블리의 경우입니다. 다중 파일 어셈블리(multifile assembly)에서 ‘주’ 모듈은 항상 어셈블리 매니페스트가 있는 모듈입니다. 다른 모듈들은 IL 코드나 자원을 담고 있습니다. 매니페스트에는 어셈블리를 구성하는 다른 모듈들의 상대적 위치가 들어 있습니다.

 

어셈블리의 장점

어셈블리는 매우 저급의(하드웨어 낮은 레벨) 일들을 처리할 수 있습니다. 여러분이 어셈블리를 사용하면, 특정 프로세서에만 있는 레지스터나 I/O 를 바로 접근할 수 있습니다. 크리티컬 섹션 등에서 데드락과 같은 일을 야기할 수 있는 여러개의 프로세스 쓰레드들의 코드 동작을 매우 정확히 컨트롤 할 수 있습니다. 즉, 코드 하나하나의 동작을 모두 제어하고, 여러분이 생각한 대로 움직이게 할 수 있습니다.
일반적인 컴파일러가 제공하는 환경과, 생성하는 코드의 규칙들을 무시한 채 작업할 수 있습니다. 속도의 최적화 등을 위해 메모리 할당에 관한 규칙이나, 쓰레딩, 함수 호출 규칙과 같은 것들을 일시적으로 무시하고 프로그래밍 할 수 있습니다.  서로 다른 규약을 사용하는 여러개의 코드들 간의 인터페이스를 구축할 수 있습니다. 일반적인 고수준 언어(C  또는  pascal)용 컴파일러로는 생성하기 힘든 특정 프로세서의 특수한 프로그래밍 모드에 접근할 수 있습니다. 예를 들면, 인터페이스 스타트업을 위해 프로세서의 16비트 모드를 사용한다든지, 펌웨어용 프로그램을 만든다든지, 인텔 컴퓨터에서 레거시 코드(legacy code)를 만든다든지 하는 일을 어셈블리를 사용해서 할 수 있스빈다.
또한, 코드 최적화를 제대로 시키지 못하는 컴파일러의 코드를 직접 최적화 시켜서 그런 컴파일러가 생성한 느리고 불필요한 루프나 루틴들을 매우 빠르고, 효율적인 루프로 바꾸어 줄 수 있습니다.
여러분의 하드웨어 설정에만 완벽하게 최적화된 코드를 직접 제작할 수 있습니다. 범용적이고 일반적인 호환성을 위한 불필요한 군살을 여러분의 코드에서 뺄 수 있습니다. 


TOP

Designed by 티스토리