6. Assembly - GAC(Global Assembly Cache)

CLR 2010. 2. 2. 09:00 Posted by 알 수 없는 사용자

오늘은 GAC (Global Assembly Cache)에 대해서 공부해 보도록 하겠습니다. GAC는 보통 윈도우 설치 폴더 아래에 위치합니다. 만약 윈도우 설치 폴더가 C:\Windows 라면

C:\Windows\Assembly

에 위치해 있습니다. 윈도우 탐색기를 이용하여 한번 확인해 봅시다.

윈도우 7에서는 이렇게 Assembly 별로 세부 정보들을 정리하여 보여주고 있네요. 지난 주에 배웠던 Strongly named assemblies의 정보들이 보입니다. 이름과 버전, culture(locale) 그리고 공개 키 토큰 정보 입니다. 실제로는 기능별/제품별로 굉장히 많은 하위 디렉토리 구조로 구성되어 있습니다. 이런 식으로요.



자 그러면 이 GAC라는 곳에 우리가 만든 Strongly named assemblies를 복사하면 우리의 Assembly를 전역적으로 사용할 수 있는 것일까요? 당연히- 아닙니다.

GAC에 넣어주는 도구가 있습니다. 바로 GACUtil.exe 라는 툴입니다. 실행시켜보면 다음과 같은 다양한 옵션에 대한 안내를 해 줍니다.


다양한 옵션 설명 중 /i 가 바로 assembly를 GAC에 인스톨하는 옵션임을 알 수 있습니다. 그리고 /u가 지정된 assembly를 언인스톨하는 옵션이군요. 이 툴을 이용하여 우리가 만든 Strongly named assembly를 GAC에 설치할 수 있습니다.

GAC라는 영역이 한번 등록시켜놓으면 편리하게 어느 어플리케이션이나 편리하게 사용할 수 있게 됨은 사실이지만 GAC에 Assembly가 설치되게 되면 단순 파일 복사, 삭제 등의 작업만으로 해당 Assembly를 관리할 수 없게 됩니다. 그래서 손쉬운 배포를 위해서는 가능하면 GAC에 등록하는 형태의 배포가 아닌 전용배포의 방식이 관리하기에 편리한 면도 있습니다.

이 GAC가 존재함으로써 시스템 전역적으로 assembly를 사용할 수 있다는 것 외에 어떤 장점이 있을까요. 우선 지난 주에 언급했던 내용 중에 DLL Hell과 관련된 이야기를 기억하시는지요? 다른 회사에서 만든 같은 이름의 DLL 모듈로 인한 충돌 문제나 같은 회사에서 만든 같은 이름의 DLL모듈이라고 해도 버전이 틀려서 발생하는 문제등을 GAC는 훌륭히 처리해 줍니다. 같은 이름을 가진 Assembly라고 하더라고 GAC의 정해진 알고리즘에 의해 제각기 분리된 영역에 설치되게 되고 각 어플리케이션이 요구하는 Assembly를 정확히 구별하여 사용할 수 있도록 구성해 주는 것입니다.


그렇다면 GAC의 내부의 구조에 대해 간략하게 살펴보도록 할까요?

우선 Assembly 디렉토리 내를 살펴보니 다음과 같이 구성되어 있네요. 여기서

GAC 는 CLR 1.0, 1.1 버전에서 생성된 Assembly들이 포함되어 있습니다. 이 곳에 있는 Assembly들은 오직 x86 그러니까 32비트 OS환경 또는 64비트 OS환경에서 WoW64기술이 적용되어 실행됩니다. 이곳에는 Native x86코드가 포함되어 있는 경우도 있습니다.

GAC_32는 CLR 2.0 버전에서 생성된 Assembly들로써 32비트 환경의 OS 또는 64비트 OS환경에서 WoW64가 적용되어 실행되는 Assembly들이 저장되어 있습니다. 여기도 역시 Native x86코드가 포함되어 있는 assembly도 있습니다.

GAC_MSIL은 CLR 2.0 버전에서 생성된 Assembly들이 저장되어 있는데 순수하게 IL코드들로만 구성되어 있는 Assembly들이 저장되어 있습니다. 이 디렉토리 하부의 Assembly들은 32비트나 64비트의 OS 환경을 가리지 않습니다.

위의 이미지에는 나와있지 않지만 GAC_64라는 디렉토리도 있습니다. GAC_32와 비슷한 이름으로 보아 유추가 가능하겠지요? CLR 2.0 버전에서 생성된 Assembly들이며 64비트 OS 환경에서 실행되는 Assembly들이 저장되어 있는 공간입니다.

그리고 NativeImages.. 로 시작되는 디렉토리도 보이네요. 이 곳에는 NGen.exe라는 CLR의 Native Code 컴파일러를 이용하여 컴파일된 Assembly들이 저장되는 곳입니다.

NGen.exe


자 이젠 좀 더 아래 디렉토리로 들어가 볼까요? GAC_MSIL 디렉토리를 들어가 봅시다.


아 딱 보니 대충 짐작이 가네요. Namespace별로 디렉토리들이 구성되어 있는 것을 알 수 있습니다. 또 들어가 봅니다.


오 이것도 대충 짐작이 갑니다. 버전과 공개키 토큰이군요. 원래는 다음과 같은 형식으로 구성되어 있습니다.

(버전)_(Culture)_(공개 키토큰)

그런데 저 디렉토리 안에 있는 Assembly는 Culture 정보가 없기 떄문에 언더바(_) 두개로 Culture 정보가 생략되어 있네요. 그럼 저런 형식의 디렉토리 안을 들어가 보면 assembly 파일이 있겠지요?

네. 존재하네요. GAC는 이런식의 구조로 Assembly를 관리하고 있습니다. :)


'CLR' 카테고리의 다른 글

8. System.Object (2)  (0) 2010.03.03
7. System.Object  (0) 2010.02.16
5. Assembly - Strongly named assemblies  (0) 2010.01.26
4. Assembly  (2) 2010.01.15
3. MSCorLib & Metadata  (4) 2010.01.06