오늘은 미천한 저에게는 너무나 어렵고 난감하고. 헷깔리는 어셈블리에 대해 더 알아보겠습니다.

어셈블리란
- 응용프로그램을 구성하는 기본단위
- 배포, 설치, 버전관리, 보안권한 지정의 단위
  (exe나 dll같은 실행파일 하나를 칭하는 개념?)
- 기계어 코드와 1:1 로 대응되는 어셈블리와는 동음이의어일뿐!!

어셈블리는 크게 4가지로 구성됩니다.

 어셈블리 메타 데이터
 타입 메타 데이터
 MSIL코드
 리소스

위의 두개 메타데이터는 일종의 헤더이고
아래의 두개 코드와 리소스는 어셈블리의 실제내용입니다.
(이중 일부는 어셈블리의 종류에 따라 생략될 수 도 있습니다.)

어셈블리 메타데이터를 저장하는 장소를 매니페스트(Manifest, 지난번에 나왔었죠. 어려운말)라고 하는데
보통 어셈블리에 통합되 있지만 별도 파일에 둘수도 있습니다.

어셈블리에는
이름, 버전번호, 컬처, 강력한 이름, 파일 목록, 참조 타입, 참조하는 타입등의 기본정보 외에도
커스텀 어트리뷰트로 상표, 저작권, 개발사 등 추가정보를 더 넣을수도 있습니다.
때문에 레지스트리를 쓸 필요가 없는것이죠.


어셈블리를 스스로 설명 가능한 모듈이라 하는데 이는 자신의 모든 정보를 스스로 포함하고 있기 때문입니다.
 
역시나 저에게는 어셈블리는 너무나 멀고도 험한 개념인듯 해요. :(

by 피요히코~ 2009. 4. 29. 23:19
영어를 잘 못해서 그런건지.. (잘 해도 어려울꺼 같은)
메니페스트는.. 일단 말부터 너무 어려운거 같아요..

일단 메니페스트가 뭔지. (더불어 어셈블리가 뭔지 한번 정리를 해보죠... 제가 잘 몰라서.. )




네이뇬이 이렇게 가르쳐 주네요...
하지만 제가 원하는 대답은 아니네요..

이제 곧 영국으로 가버리는(이제 얼굴좀 익혔는데. ㅠ) 경훈씨가 HOONS에 올린 글을 보면..


.NET Assembly

닷넷을 어느정도 공부해본 사람들은 어셈블리(assembly)에 대한 말을 많이 듣게 되는데, 닷넷 어셈블리가 무엇인지, 어떻게 사용하는 것인지 한번 생각해 보도록 합시다.

 

어셈블리란 무엇인가

1. 어셈블리는 코드들의 논리적인 묶음이다.

2. 어셈블리는 물리적으로 DLL또는 EXE로 존재한다.

3. 한 개의 어셈블리는 한 개이상의 파일을 포함할 수 있다.

4. 어셈블리안에는 어떤 형태의 파일도 포함될 수 있다(예: 텍스트 파일, 이미지파일등)

5. 작성된 소스코드가 어셈블리로 묶여지지 않다면, 다른 어플리케이션에서는 이용할 수가 없다.

6. 어셈블리파일엔 자체정보를 가지고 있는데 이를 어셈블리 메니페스트(Manifest)라 한다.

 

어셈블리 메니페스트(manifest) 대해

1. 어셈블리 메니페스트는 해당 어셈블리의 정보들을 저장하고 있는 데이터 구조(data structure)이다.

2. 이러한 정보는 어셈블리 파일(DLL/EXE) 자체에 포함되어 있다.

3. 메니페스트는 버전정보나, 구성된 파일의 리스트등을 포함하고 있다.

 

Private assembly VS Shared assemly

단일 어플리케이션에만 사용되는 어셈블리를 private assembly라 한다. 예를 들어서, 여러분이 업무로직을 가지고 있는 DLL을 하나 만들었다면, 그리고 DLL을 사용하는 클라이언트 어플리케이션이 오직 한 개이라면, 그것은 대부분 private assembly인 것이다. 이 때 프로그램이 제대로 동작되기 위해서는 프로그램이 설치된 같은 폴더에 DLL이 존재해야만 한다. 

이와 반대로, 만약 하나의 DLL을 만들고 나서 이를 여러 어플리케이션에서 사용하도록 만들었다면, 각 어플리케이션의 해당 폴더마다 복사본이 존재하는 것이 아니라, DLL을 Global Assembly Cache에 위치시켜야만 한다. 이러한 어셈블리를 shared assembly라 한다.

 

Global Assembly Cache ?

GAC(Global Assembly Cache)는 모든 shared assembly가 저장되는 특정 폴더일 뿐이다.

이 폴더의 위치는 <드라이브명>:/winnt/assembly 이다. 실제 이 폴더에 들어가보면, 많은 전역 어셈블리들을 볼 수 있다.

 

어셈블리는 DLL 지옥을 해결하였다는데

앞에서 언급했듯이 직접 작성한 대부분의 어셈블리는 private이다. 그러므로 각 어플리케이션은 자체적으로 설치된 폴더에 있는 어셈블리를 참조한다. Private형식에서는 같은 이름의 여러버전이 있다하더라도 충돌을 피할 수 있다.

이해를 돕기위해 한가지 예를 들어본다.

1. Assembly1이라는 이름의 어셈블리를 제작한다.

2. Assembly1을 이용하는 Client1이라는 어플리케이션을 만든다.

3. 클라이언트 프로그램을 c:\MyApp1이라는 폴더에 설치하고, Assembly1도 이 폴더에 설치한다.

4. 며칠이 지난 후에 Assembly1이 수정이 되었다고 가정한다.

5. 수정된 Assembly1을 이용한 클라이언트 어플리케이션(Client2)를 제작한다.

6. 이 클라이언트 프로그램을 c:\MyApp2라는 폴더에 설치하고 Assembly1도 이 폴더에 설치한다.

7. 각각의 프로그램은 같은 이름의 Assembly1이라는 어셈블리를 사용하고 있지만, 버전은 서로 다른 것이며, 아무 문제없이 충돌없이 동작된다.

 

여기까지는 Private Assembly의 예를 든것이다. 이처럼 어셈블리는 각각의 폴더에 설치되어 있기 때문에 직접 변경이 되지 않는 한 버전변경에 영향을 받지 않는다고 할 수 있다. 그럼 이번에는 Shared 어셈블리에 대해 알아보겠다. 이 경우에서는 버전이 매우 중요하다. 버전번호는 다음과 같은 형태로 생성된다.

major.mino,build.revision

만약 어셈블리에 변경을 가했을 경우, major, minor버전이 같다면 변경된 어셈블리는 기존 것과 호환된다고 할 수 있다. 만약 클라이언트 프로그램에서 어셈블리의 사용을 요청하게 되면, major,minor버전이 맞는 것중에서 가장 최근의 build와 revision을 갖는 어셈블리가 제공된다.

 

Shared Aassembly 만드는 

1. DLL/EXE를 제작할 소스코드를 준비한다.

2. SN 유틸리티를 이용하여 유니크(unique)한 어셈블리명을 생성한다.

3. AssemblyInfo 파일을 수정하여 private key를 서명한다.

4. DLL/EXE를 컴파일한다.

5. 생성된 DLL/EXE를 GACUTIL 유틸리티를 이용하여 global assembly cache에 위치시킨다.

이렇게만 하면, shared 어셈블리가 작성이 된다. 그러면 한가지씩 자세하게 알아보도록 하자.

 

Unique Assembly Name 생성법

마이크로 소프트에서는 어셈블리의 유일성을 보장하기 위해서 public-private key(공개키/개인키)기반의 로직을 이용한다. 이 공개키/개인키의 짝(pair)은 SN.EXE 라는 유틸리티를 이용해서 생성한다.(SN은 shared name의 의미를 갖고있다) 여러가지 다양한 옵션이 있지만, 일반적인 syntax는 다음과 같다.

sn -k 생성될 파일명

k는 키(key)를 생성하겠다는 의미이며, 이를 실행하면 파일이 하나 생성된다.

 

전자서명

어셈블리를 shared cache에 위치시키기 위해서는, sn유틸리티를 이용해서 만든 키를 이용하여 서명을 해야한다. 이 때 서명에 관련한 정보들을 담는 특별한 파일이 AssemblyInfo파일이다. AssemblyInfo 파일에 다음을 추가한다.

<Assembly: Assemblykeyfile("파일명")>

 

Global Assembly Cache에 등록하기

GACUTIL /i my_dll.dll

이렇다고 하네요. 아주 깔끔하게 정리가 잘 되어있네요. ㅎㅎ
(원본은 개발자가 알아두면 좋은 ASP.NET 지식 (어셈블리) 405 0 minotech@join )

자 그러면 어셈블리의 메니페스트에 저장되는 정보에는 어떤것이 있는지 보죠..

Assembly name : 어셈블리의 이름을 나타냅니다.

Versioning information :  이녀석은 4개의 부분으로 되어있고, 버전넘버가 저장되어 있습니다. 개정및 빌드넘버/ major 버전넘버와 minor 버전넘버도 포함되어 있어요

An (optional) shared name and signed assembly hash : 여긴 어셈블리 배포정보가 있어요.

Files : 어셈블리에 있는 모든 파일의 목록이 있습니다.

Referenced assemblies : 메니페스트의 어셈블리에서 직접 참조하는 모든 외부 어셈블리 목록이 있습니다.

Types : 타입이 저장되어있는 모듈과 매핑된 어셈블리의 모든 타입에 대한 목록이 포함되 있습니다. 
         
Security permissions : 어셈블리에서 명시적으로 거부된 보안사용권한(permission)의 목록입니다

Custom attributes : 타입에 따라 사용자정의(custom) 어트리뷰트는 리플렉션시 빠르게 접근하기 위해서 어셈블리의 메니페스트에 저장됩니다.

Product information Company, Trademark, Product, Copyright 값도 저장되어 있습니다




짧은 지식으로 지금 일을 하고 있지만
역시나 알아야 할것(인지는 모르겠지만ㅎㅎ)이 참 많네요.
부지런해야 겠습니다.

by 피요히코~ 2009. 4. 24. 00:34
| 1 |