[C#] 10.4 공용 어셈블리

공용 어셈블리는 전역 어셈블리 캐시(윈도우즈 설치 폴더의 하위 폴더명이 Assembly인 폴더를 말함)에 있는 어셈블리를 말합니다. 전역 어셈블리 캐시에는 파일명과 확장자가 같더라도 어셈블리의 강력한 이름이 다르면 배포할 수 있습니다.

전역 어셈블리 캐쉬
[그림 10.4] 전역 어셈블리 캐쉬

강력한 이름은 어셈블리 이름, 버전 번호, 문화권, 어셈블리 ID, 공개 키, 디지털 서명 등으로 구성합니다. 이처럼 전역 어셈블리 캐시에는 같은 이름의 DLL도 강력한 이름이 다르면 배포할 수 있습니다. 따라서 서로 다른 버전을 사용하는 응용 프로그램들이 자신에 맞는 어셈블리를 사용할 수 있습니다. 이와 같이 실행할 수 있는 특징을 병행(Side by Side) 실행이라 합니다.

간단하게 라이브러리를 만들고 병행 실행이 되는 것을 확인해 봅시다.  먼저 DemoLib 버전 1.0.0.0을 만듭시다.

using System;
namespace DemoLib
{
    public class DemoClass
    {
        public void Foo()
        {
            Console.WriteLine("Foo 1");
        }
    }
}

공용 어셈블리를 만들기 위해 솔루션 탐색기에 프로젝트에 우측 마우스를 클릭하여 나오는 컨텍스트 메뉴에서 속성을 선택하세요. 그리고 서명 탭을 선택하신 후에 어셈블리 서명 체크 박스를 선택하시고 강력한 이름 키 선택 콤보 박스에서 새로 만들기를 선택합니다. 강력한 이름 키 만들기 창에서 키 이름을 입력하면 프로젝트 항목에 만든 키가 보입니다.

[그림 10.5] 어셈블리 서명
[그림 10.5] 어셈블리 서명
강력한 이름 키 만들기
[그림 10.6] 강력한 이름 키 만들기

그리고 프로젝트를 빌드하시면 출력 폴더(기본: Debug)에 DLL 파일이 만들어집니다.

이제 작성한 DLL을 전역 어셈블리 캐시에 배포합시다. Windows7부터는 보안이 강화되어 관리자 권한으로 배포해야 합니다. 관리자 권한으로 Visual Studio 명령 프롬프트를 실행 후에 gacutil /i demolib.dll 을 치면 배포합니다.

gacutil 명령어로 전역 어셈블리 캐시에 배포
[그림 10.7] gacutil 명령어로 전역 어셈블리 캐시에 배포

 이제 배포한 공용 어셈블리를 사용하는 응용 프로그램 프로젝트를 생성하시고 demolib.dll를 참조 추가하세요. 전용 어셈블리에서 참조 추가하는 것과 같은 방법입니다.

전용 어셈블리를 참조 추가하면 자동으로 프로젝트 출력 폴더에 참조한 어셈블리 파일을 추가하지만 공용 어셈블리를 참조 추가하면 프로젝트 출력 폴더에 추가하지 않습니다. 이는 공용 어셈블리는 전역 어셈블리 캐시에 배포된 것을 사용하기 때문입니다.

그리고 프로젝트 참조 폴더에 해당 어셈블리에 오른쪽 마우스 버튼을 클릭하여 컨텍스트 메뉴에서 속성을 선택하세요. 속성 창을 보면 특정 버전을 선택할 수 있습니다. 만약, 특정 버전 속성을 false로 설정하면 새로운 버전이 배포되면 자동으로 최신 버전을 사용합니다. 하지만 특정 버전 속성을 true로 설정하면 참조한 버전의 어셈블리를 사용합니다. 여기서는 병행(Side by Side) 실행을 확인하기 위함이니 특정 버전 속성을 True로 합시다. 그리고 사용하는 코드를 작성하세요. 그리고 실행해 보세요.

특정 버전 속성 지정
[그림 10.8] 특정 버전 속성 지정
using DemoLib;
namespace UsingDemoV1
{
    class Program
    {
        static void Main(string[] args)
        {
            DemoClass dc = new DemoClass();
            dc.Foo();
        }
    }
}

▶ 실행 결과

Foo 1

그리고 DemoLib를 수정합시다. 조금 전에 만든 DemoLib를 사용하는 프로젝트는 닫아주세요.

다음은 수정한 코드입니다.

using System;
namespace DemoLib
{
    public class DemoClass
    {
        public void Foo()
        {
            Console.WriteLine("Foo 2");
        }
    }
}

프로젝트 속성 창을 열어서 응용 프로그램 탭에 어셈블리 정보 버튼을 클릭합시다. 그리고 버전 정보를 수정하세요. 버전 정보를 수정하여 조금 전에 만들어 배포한 어셈블리와 파일명과 확장자는 같지만 강력한 이름은 다릅니다. 전역 어셈블리 캐시에서는 강력한 이름으로 배포하므로 재배포 가능합니다.

어셈블리 버전 수정
[그림 10.9] 어셈블리 버전 수정

 프로젝트를 빌드한 후 gacutil 명령어를 이용하여 다시 배포합시다. 그리고 방금 만들었던 응용을 실행해서 참조한 버전의 어셈블리를 사용하고 있음을 확인하세요.

그리고 새로운 버전을 참조하여 사용하는 응용 프로그램을 작성해 보세요. 소스 코드는 먼저 만들었던 것과 같게 만들어도 됩니다. 그리고 두 개의 응용 프로그램을 실행해 보시면 각각 자신이 참조하는 버전의 어셈블리를 사용함을 확인하실 수 있습니다.