extern alias
extern alias (C# Reference)
가끔은 정규화된 형식 이름(fully qualified type name)이 똑같은 어셈블리 두 버전을 동시에 참조해야 할 때가 있어요. 예를 들어 같은 애플리케이션 안에서 어셈블리의 서로 다른 버전을 두 개 이상 써야 하는 상황이죠. 이럴 때 외부 어셈블리 별칭(external assembly alias)을 이용하면 각 어셈블리의 네임스페이스를 별칭 이름을 딴 루트 네임스페이스 안에 감쌀 수 있어요. 이렇게 해 두면 같은 파일 안에서 두 버전을 모두 문제없이 사용할 수 있습니다.
본문
[!NOTE]
extern키워드는 메서드 한정자로도 쓰여요. 관리되지 않는 코드(unmanaged code)로 작성된 메서드를 선언할 때 사용하죠.extern문서에서 확인할 수 있어요.
정규화된 형식 이름이 같은 어셈블리 두 개를 참조하려면, 먼저 .csproj 파일에 별칭을 지정하고 아래 코드를 추가하면 됩니다.
<Reference Include="grid.dll">
<Aliases>GridV1</Aliases>
</Reference>
<Reference Include="grid20.dll">
<Aliases>GridV2</Aliases>
</Reference>
자세한 내용은 Visual Studio 문서의 CSC task 문서에서 더 볼 수 있어요.
이 명령은 GridV1과 GridV2라는 외부 별칭을 만들어요. 이 별칭을 프로그램 안에서 쓰려면 extern 키워드로 참조하면 됩니다. 예를 들어 이렇게요.
extern alias GridV1;
extern alias GridV2;
각 extern alias 선언은 전역 네임스페이스(global namespace)와 나란히 있되 그 안에 속하지는 않는 루트 네임스페이스를 하나 더 도입해요. 각 어셈블리의 형식은 해당 네임스페이스 별칭을 뿌리로 하는 정규화된 이름을 쓰면 모호함 없이 가리킬 수 있어요.
앞선 예시에서 GridV1::Grid는 grid.dll의 그리드 컨트롤이고, GridV2::Grid는 grid20.dll의 그리드 컨트롤이에요.
Visual Studio에서 사용하기
Visual Studio를 쓰고 있다면 비슷한 방식으로 별칭을 지정할 수 있어요.
프로젝트에 grid.dll과 grid20.dll 참조를 추가하고, 속성 탭을 열어 Aliases를 각각 global에서 GridV1, GridV2로 바꿔 주면 됩니다.
그 뒤에는 앞서 설명한 것과 똑같은 방식으로 쓰면 돼요.
extern alias GridV1;
extern alias GridV2;
이제 using alias directive로 네임스페이스나 형식에 별칭을 만들 수도 있어요. 더 자세한 내용은 using directive 문서를 참고하세요.
using Class1V1 = GridV1::Namespace.Class1;
using Class1V2 = GridV2::Namespace.Class1;
C# Language Specification
자세한 내용은 C# 언어 사양에서 확인할 수 있어요.