1. DLL 제작

Subject	C# 어셈블리	Date	2009.08.21	Name	Kim Yong Yeon

실무 환경에서는 응용프로그램의 복잡한 형태가 필요하기 때문에 대부분의 주요 루틴들은 DLL로 작성하고 주 실행 파일은 DLL들을 조립하여 응용프로그램을 완성 하는 식이다.이런 구조로 개발을 진행해야 분담 작업이 용이하고 코드를 재사용할 수 있다.

< 컴파일 명령어 >

csc /t:library Class1.cs

< 옵션 설명 >

/t : 빌드 타깃

library : 실행 파일이 아닌 라이브러리, 즉 DLL을 생성하라는 뜻이다.

이프로그램을 배포할 때는 두 개의 어셈블리를 같이 배포해야 한다. Server.dll을 삭제하거나 이름을 바꾸면 제대로 실행되지 않는다.

닷넷은 언어에 독립적이어서 C#으로 만든 어셈블리를 다른 언어에서도 아무런 문제없이 사용할 수 있다. 반대로 VB에서 만든 클래스를 C#에서 사용할 수 있고 MC++이나 J# 같은 다른 언어로도 어셈블리를 만들고 활용할 수 있다. 보다시피 닷넷은 언어에 완전히 독립적이다.

2. 다중 파일 어셈블리 만들기

하나의 프로젝트나 소스를 컴파일하여 하나의 어셈블리를 만드는 것이 보통이다. 이때 컴파일된 결과로 생성된 exe나 dll파일이 곧 어셈블리 하나가 되는데 이런 어셈블리를 단일 파일 어셈블리라고 한다. 이에 비해 여러 개의 파일로 구성되는 어셈블리를 다중 파일 어셈블리라고 한다. 코드를 여러개의 파일로 쪼갤 수도 있으며 jpg나 mpg 파일처럼 덩치가 큰 리소스나 또는 실행에 필요한 데이터 파일 등도 어셈블리를 구성하는 모듈이다.

통합 개발 환경은 이런 다중 파일 어셈블리 제작을 지원하지 않음

명령 행으로만 만들 수 있다.

< 도스상(CMD)에서 Test 해야함 >

csc /t:module Dog.cs

csc /t:library /addmodule:Dog.netmodule Cat.cs

csc /t:exe /r:Cat.dll Client.cs

Dog.netmodule을 만든다.

C:\cshap>csc /t:module Dog.cs

Microsoft (R) Visual C# 2005 Compiler version 8.00.50727.1433

for Microsoft (R) Windows (R) 2005 Framework version 2.0.50727

Copyright (C) Microsoft Corporation 2001-2005. All rights reserved.

Cat.dll을 만든다.

C:\cshap>csc /t:library /addmodule:Dog.netmodule Cat.cs

Microsoft (R) Visual C# 2005 Compiler version 8.00.50727.1433

for Microsoft (R) Windows (R) 2005 Framework version 2.0.50727

Copyright (C) Microsoft Corporation 2001-2005. All rights reserved.

exe 파일을 만든다.

C:\cshap>csc /t:exe /r:Cat.dll Client.cs

Microsoft (R) Visual C# 2005 Compiler version 8.00.50727.1433

for Microsoft (R) Windows (R) 2005 Framework version 2.0.50727

Copyright (C) Microsoft Corporation 2001-2005. All rights reserved.

exe 파일이 있는지 확인하고 실행해 본다.

C:\cshap>dir

C 드라이브의 볼륨에는 이름이 없습니다.

볼륨 일련 번호: DCF1-7990

C:\cshap 디렉터리

2009-08-21  오후 02:05    <DIR>          .

2009-08-21  오후 02:05    <DIR>          ..

2009-08-21  오후 02:02               133 Cat.cs

2009-08-21  오후 02:04             3,072 Cat.dll

2009-08-21  오후 02:04                 0 CA_LIC

2009-08-21  오후 02:04                 0 cd

2009-08-21  오후 02:02               164 Client.cs

2009-08-21  오후 02:05             3,072 Client.exe

2009-08-21  오후 02:04                 0 csc

2009-08-21  오후 02:04                 0 cshap

2009-08-21  오후 02:04                 0 cygwin

2009-08-21  오후 02:04                 0 dir

2009-08-21  오후 02:04                 0 Documents

2009-08-21  오후 02:02               133 Dog.cs

2009-08-21  오후 02:04             2,048 Dog.netmodule

2009-08-21  오후 02:04                 0 Fport

2009-08-21  오후 02:04                 0 nmap-5.00

2009-08-21  오후 02:04                 0 NVIDIA

2009-08-21  오후 02:04                 0 Program

2009-08-21  오후 02:04                 0 telnetEnable

2009-08-21  오후 02:04                 0 vim

2009-08-21  오후 02:04                 0 WINDOWS

2009-08-21  오후 02:04                 0 새

2009-08-21  오후 01:54    <DIR>          새 폴더

21개 파일               8,622 바이트

3개 디렉터리  14,495,125,504 바이트 남음

C:\cshap>Client

멍멍

야옹

3. 공유 어셈블리

어셈블리는 사용 가능한 클라이언트의 종류에 따라 전용과 공유 두 가지로 분류된다. 둘 다 내부 구조는 동일하되 이름을 붙이는 방법과 버전 관리 정책, 그리고 저장되는 위치만 다르다. 다른 어셈블리를 위해 서비스를 제공한다는 면에서는 같다.

전용 어셈블리 : 특정 클라이언트 혼자서만 사용하는 어셈블리이다. 보통 클라이언트 실행 파일이 있는 디렉터리에 위치하여 클라이언트와 함께 배포된다. 클라이언트가 실행될 때 메모리로 같이 로드되며 별도의 버전 체크를 하지 않는다. 클라이언트와 같은 디렉터리에 있으므로 관리하기 쉽다. 설치 없이 복사만 해서 쓸 수 있으며 이동이나 설치 해제도 쉽다. 클라이언트 혼자만 사용하므로 삭제해도 다른 응용프로그램에는 영향을 주지 않는다.

공유 어셈블리 : 불특정한 다수의 클라이언트들이 사용하는 어셈블리이다. 누구나 이 어셈블리를 로드해서 사용할 수 있어야 하므로 GAC(Global Assembly Cache)라는 약속된 디렉터리에 위치 한다. 한 디렉터리에 굉장히 많은 전용 어셈블리들이 같이 저장되므로 상호 구분을 위해 강력한 이름(Strong Name)을 붙여 이름과 버전으로 서로를 엄격하게 구분한다.

공유 어셈블리가 저장되는 위치 : C:\windows\assembly

< 실습 >

C:\cshap>sn -k ShareDll.snk -> 키 쌍을 ShareDll.snk에 썼습니다.

ShareDll 프로젝트를 만든다.

프로젝트 설정 대화상자에 서명페이지로 이동하여 좀전에 만들어 두었던 ShareDll.snk를 지정한다.

컴파일을 하면 이제 ShareDll.dll 파일이 생성된다.

ShareDll.dll 파일을 C:\windows\assembly 폴더로 이동시킨다.강력한 이름이 없다거나 훼손된 어셈블리는 설치 거부된다. 따라서 GAC에는 공유 어셈블리만 설치되며 전용 어셈블리는 설치할 수 없다. 공유 어셈블리는 복수의 응용 프로그램이 사용하므로 응용 프로그램은 설치만 하고 제거는 인스톨러에게 맡기는 것이 좋다.

using ShareDll 네임스페이스를 지정하고 Client 프로그램을 작성한다. 이대로 실행하면 ShareDll 네임스페이스를 찾을 수 없다는 에러가 발생할 것이므로 ShareDll에 대한 참조를 추가 해야 한다. GAC에 설치된 것을 참조할 필요 없이 ShareDll의 Debug 디렉터리 있는 ShareDll.dll을 지정하면 된다.

4. 프로빙

클라이언트가 어셈블리의 위치를 찾아내는 방법을 프로빙(Probing) 또는 리졸브(Resolve)라고 한다.클라이언트의 매니페스트에는 어떤 어셈블 리가 필요하다는 정보가 기록되어 있으므로 이 정보를 참조하여 어셈블리의 위치를 찾아 로드한다. 전용 어셈블리의 경우 실행 파일이 있는 디렉터리를 우선적으로 검색하여 로드하므로 통상 실행 파일이 있는 디렉터리에 같이 넣어 두면 된다.

어셈블리의 중요한 부분으로 메타데이터의 한 부분이며 어셈블리를 참조하기 위해 필요한 모든 정보를 묘사한다.

*매니페스트의 구성

ID(이름, 버전, 컬처, 공개 키)

이 어셈블리에 포함된 파일의 목록. 하나의 어셈블리는 반드시 적어도 하나의 파일을 가져야 하고 여러 개의 파일을 포함할 수 있다.

참조되는 어셈블리의 리스트. 어셈블리가 사용하는 모든 어셈블리의 버전 번호와 공개 키는 매니페스트에 문서화된다.

권한 요청(Permission set)의 집합. 이 어셈블리를 실행하기 위해 필요한 권한.(.NET 보안 파트에서 참조바람)

내보내어진 형식(Exported type)은 모듈에 포함되지 않으면 매니페스트의 일부분이 아니다.

모듈은 재사용의 단위이다. 형식 설명은 메타데이터로서 어셈블리 내부에 저장되고 구조체와 클래스가 가진 프로퍼티와 메소     드의 정보는 메타데이터에서 추출될 수 있다.

이것은 COM에서 형식을 설명하기 위해 사용되었던 형식 라이브러리를 대신하며 COM 클라이언트가 사용할 형식 라이브러리는     매니페스트로부터 쉽게 생성될 수 있다. 리플렉션 메커니즘은 내보내어진 형식에 관한 정보를 사용하여 클래스에 런타임시      바인딩을 수행한다.