범용 어셈블리 캐시
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
범용 어셈블리 캐시(GAC)는 .NET 어셈블리를 저장하는 데 사용되는 저장소로, 어셈블리의 특정 버전 관리 체계를 준수해야 한다. GAC는 전역 어셈블리 캐시 도구(gacutil.exe)와 어셈블리 캐시 뷰어(shfusion.dll)를 사용하여 상호 작용할 수 있다. GAC는 동일한 컴퓨터에서 여러 버전의 어셈블리를 동시에 사용할 수 있게 해주지만, 특정 .NET Framework 버전에서만 실행되는 경향이 있으며, 강력한 이름을 가져야 하는 등 몇 가지 함정이 존재한다.
더 읽어볼만한 페이지
- 공통 언어 기반 - 어셈블리 (CLI)
어셈블리 (CLI)는 CLI 환경에서 실행되는 코드의 기본 단위이며, 어셈블리 이름, 버전, 문화권, 공개 키 토큰으로 구성되고, 코드 접근 보안은 어셈블리와 증거를 기반으로 한다. - 닷넷 용어 - XAML
XAML은 마이크로소프트에서 개발한 XML 기반의 마크업 언어로, 사용자 인터페이스, 데이터 바인딩, 이벤트 처리 등을 정의하며 WPF, Silverlight, WF, WinRT API 앱, Xamarin.Forms 등에서 UI 개발에 널리 사용된다. - 닷넷 용어 - 윈도우 커뮤니케이션 파운데이션
윈도우 커뮤니케이션 파운데이션(WCF)은 마이크로소프트가 분산 시스템 개발을 용이하게 하고 서비스 지향 아키텍처(SOA)를 구현하기 위해 개발한 프레임워크로, 다양한 전송 프로토콜과 메시지 인코딩 방식을 지원하며 닷넷 프레임워크 3.0의 일부로 출시되어 다양한 유형의 애플리케이션 통합을 목표로 한다. - 윈도우 관리 - 블루스크린
블루스크린은 윈도우 운영체제에서 발생하는 치명적인 오류로, 컴퓨터 작동을 멈추고 파란색 화면에 오류 메시지를 표시하며, 하드웨어 또는 소프트웨어 문제로 인해 발생하고, 시스템 복원, 안전 모드 부팅 등의 방법으로 대처한다. - 윈도우 관리 - 파워셸
파워셸은 마이크로소프트에서 개발한 작업 자동화 솔루션으로, 명령줄 셸과 스크립트 언어의 기능을 결합하여 윈도우 시스템 관리를 위해 설계되었으며, .NET 프레임워크 기반의 객체 지향적 특징을 갖고 다양한 플랫폼에서 자동화 스크립트 작성 및 실행, 시스템 구성 관리 등에 활용된다.
범용 어셈블리 캐시 |
---|
2. 요구사항
범용 어셈블리 캐시(GAC)에 포함되는 어셈블리는 특정 요구사항을 충족해야 한다. 여러 버전의 코드가 동시에 실행될 수 있도록(사이드 바이 사이드 실행) 특정 버전 관리 체계를 준수해야 하며, 반드시 강력한 이름으로 지정되어야 한다.
GAC를 사용하는 주요 방법에는 두 가지가 있다. 하나는 명령줄 유틸리티인 전역 어셈블리 캐시 도구(gacutil.exe)이고, 다른 하나는 Windows 탐색기에 통합된 어셈블리 캐시 뷰어(shfusion.dll)이다.[1][5][2][7] 각 도구의 자세한 사용법은 아래 하위 섹션에서 설명한다.
3. 사용법
3. 1. 전역 어셈블리 캐시 도구 (gacutil.exe)
gacutil.exe는 .NET Framework 1.1과 함께 제공되었던 명령줄 유틸리티이며, 현재도 .NET SDK와 함께 사용할 수 있다.[1][5]
이 도구를 사용하여 전역 어셈블리 캐시(GAC) 내에 공유 어셈블리가 있는지 확인하거나 등록할 수 있다.
GAC에 특정 공유 어셈블리가 있는지 확인하려면 다음 명령어를 사용한다.gacutil.exe /l <어셈블리 이름>
공유 어셈블리를 GAC에 등록하려면 다음 명령어를 사용한다.gacutil.exe /i <어셈블리 이름>
또는 어셈블리 파일을 직접 GAC 폴더에 복사하여 등록할 수도 있다.[6] .NET 버전에 따라 GAC의 위치가 다른데, .NET 4.0 이전 버전의 기본 위치는 `%windir%\assembly\` 이고, .NET 4.0 이후 버전의 위치는 `%windir%\Microsoft.NET\assembly\` 이다.
`gacutil.exe`의 다른 옵션에 대한 설명은 다음과 같이 `/?` 플래그를 사용하여 확인할 수 있다.gacutil.exe /?
3. 2. 어셈블리 캐시 뷰어 (shfusion.dll)
어셈블리 캐시 뷰어(shfusion.dll)는 범용 어셈블리 캐시(GAC)와 상호 작용하는 한 방법이다.[2] 이 뷰어는 Windows 탐색기에 통합되어 있어 사용자가 GAC의 내용을 시각적으로 확인할 수 있게 해준다.[7] 예를 들어, %windir%\assembly\
또는 %WINDIR%\Microsoft.NET\assembly\
와 같은 특정 폴더를 탐색하면 캐시에 저장된 어셈블리 목록이 나타난다. 이 목록에는 각 어셈블리의 버전, 문화권, 공개 키 토큰, 프로세서 아키텍처 정보가 포함되어 있다. 사용자는 파일을 끌어서 놓는(드래그 앤 드롭) 방식으로 어셈블리를 설치할 수 있으며, 제거할 때는 해당 어셈블리를 선택한 후 Delete 키를 누르거나 상황에 맞는 메뉴를 이용하면 된다.
하지만 .NET Framework 4 버전부터는 어셈블리 캐시 뷰어의 셸 확장 기능이 더 이상 사용되지 않는다.[3][8]
4. 사용 예시
어떤 컴퓨터에 이름은 같지만 버전이 다른 두 개의 CLI 어셈블리가 있다고 가정해 보자. 예를 들어, 하나는 'AssemblyA' 버전 1.0이고 다른 하나는 'AssemblyA' 버전 2.0이다. 이 두 어셈블리는 모두 'AssemblyA'라는 파일 이름으로 컴파일되어야 한다. 하지만 FAT32와 같은 파일 시스템에서는 파일 이름이 같으면 동일한 디렉터리에 두 파일을 함께 저장할 수 없다. 이때 범용 어셈블리 캐시(GAC)가 유용하게 사용된다. GAC는 일종의 가상 파일 시스템처럼 작동하여, 각 프로그램이 필요로 하는 특정 버전의 어셈블리('AssemblyA' 버전 1.0 또는 버전 2.0)를 구분하여 사용할 수 있도록 지원한다. 즉, GAC를 통해 동일한 이름을 가진 여러 버전의 어셈블리를 한 컴퓨터에서 문제없이 관리하고 사용할 수 있게 된다.
5. 구현
GAC(범용 어셈블리 캐시)는 윈도우 운영 체제 내에 물리적으로 존재하는 개념이라기보다는, 공용 언어 런타임(CLR)에 의해 구현되고 관리되는 방식이다. 실제로 전역적으로 사용 가능한 어셈블리 파일들은 `%systemroot%\assembly` 폴더와, .NET Framework 4.0 이후 버전부터는 `%systemroot%\Microsoft.NET\assembly` 폴더에 저장된다.
이 폴더들 안에 있는 어셈블리 파일들은 파일 이름 자체에 버전 정보와 공개 키 토큰 정보를 포함하도록 관리된다. 이러한 이름 지정 방식 덕분에, 동일한 어셈블리라 하더라도 서로 다른 버전들이 같은 폴더 내에 문제없이 공존할 수 있으며, 각 버전을 고유하게 식별하고 관리하는 것이 가능하다.
GAC에 포함될 어셈블리는 특정 요구 조건을 만족해야 한다. 가장 중요한 것은 강력한 이름을 가져야 한다는 점이다. 또한, 여러 버전의 코드가 충돌 없이 동시에 실행될 수 있도록 정해진 버전 관리 규칙을 따라야 한다.
어떤 애플리케이션이 GAC에 있는 특정 어셈블리를 사용하고자 할 때는, 참조 과정에서 원하는 버전을 명시적으로 지정할 수 있다. 공용 언어 런타임은 이 정보를 바탕으로 파일 이름을 확인하여 정확히 해당 버전의 어셈블리를 찾아 로드한다.
6. 함정
GAC는 과거의 DLL 지옥 문제를 해결하는 데 도움을 주지만, 몇 가지 단점을 가지고 있다.[4]
- .NET Framework 버전 호환성 문제: 기본적으로 응용 프로그램은 컴파일에 사용된 특정 버전의 .NET Framework에서만 실행되도록 설계되는 경우가 많다. 이로 인해 새로운 버전의 .NET Framework가 설치된 시스템에서는 해당 응용 프로그램이 제대로 작동하지 않을 수 있다. 최신 버전에서 문제없이 실행될 수 있는 경우에도 이러한 문제가 발생할 수 있어, 기술 변화에 따른 지속적인 호환성 확보 노력이 필요하다.
- 조건부 컴파일 필요성: 응용 프로그램이 사용하는 핵심 .NET API 중 일부가 특정 버전의 프레임워크에서만 지원될 경우, 여러 버전에 대응하기 위해 조건부 컴파일을 사용해야 하는 번거로움이 발생할 수 있다.
- 네이티브 코드 호환성: 네이티브 코드에 의존하는 .NET 응용 프로그램의 경우, GAC를 사용하더라도 여전히 호환성 문제가 발생할 위험이 있다.
- 강력한 이름 부여의 어려움: GAC에 추가되는 모든 어셈블리는 강력한 이름을 가져야 한다. 하지만 어셈블리에 강력한 이름을 부여하는 과정은 여러 상황에서 복잡하고 어려울 수 있다. 예를 들어, 강력한 이름이 없는 다른 어셈블리에 의존하는 어셈블리는 GAC에 등록할 수 없다. 또한, 개발자가 소스 코드를 소유하지 않은 타사 어셈블리의 경우, 강력한 이름으로 변환하는 것이 현실적으로 불가능할 수 있다. 이러한 제약은 특히 자원이 제한적인 개발 환경에서 부담으로 작용할 수 있다.
- 탐색기 접근성 제한: 표준 Windows API를 사용하여 파일을 탐색할 때, 윈도우 탐색기가 GAC의 내용을 사용자 친화적으로 보여주기는 하지만, 'assembly' 폴더 내부에 있는 DLL 파일을 직접 선택하는 것은 허용되지 않는다.
참조
[1]
웹사이트
Global Assembly Cache Tool (Gacutil.exe)
http://msdn.microsof[...]
Microsoft Corporation
2010-05-27
[2]
웹사이트
Assembly Cache Viewer (Shfusion.dll)
http://msdn.microsof[...]
Microsoft Corporation
2010-05-27
[3]
웹사이트
How to: View the Contents of the Global Assembly Cache
http://msdn.microsof[...]
Microsoft Corporation
2010-07-22
[4]
웹사이트
Ten Managed Application Pitfalls that Kill Version Compatibility
https://archive.toda[...]
devsource.com
2005-02-11
[5]
웹사이트
How to: View the Contents of the Global Assembly Cache
http://msdn.microsof[...]
マイクロソフト
2010-07-22
[6]
문서
[7]
웹사이트
Ten Managed Application Pitfalls that Kill Version Compatibility
http://www.devsource[...]
devsource.com
2005-02-11
[8]
웹사이트
How to: View the Contents of the Global Assembly Cache
http://msdn.microsof[...]
マイクロソフト
2010-07-22
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com