Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일

C# - 네임스페이스까지 동일한 타입을 2개의 DLL에서 제공하는 경우 충돌을 우회하는 방법

예를 들어 볼까요?

다음의 클래스를 포함하는 2개의 Class Library 프로젝트를 만들고,

// ClassLibrary1 프로젝트

namespace MyLibrary
{
    public class MyClass
    {
        public static void Print()
        {
            Console.WriteLine("ClassLibrary1: MyClass");
        }
    }
}

// ClassLibrary2 프로젝트

namespace MyLibrary
{
    public class MyClass
    {
        public static void Output()
        {
            Console.WriteLine("ClassLibrary2: MyClass");
        }
    }
}

콘솔 프로젝트를 만들어 위의 2개 dll(ClassLibrary1, ClassLibrary2)을 참조 추가합니다. 그런 다음 이렇게 코딩을 하면,

using System;

internal class Program
{
    static void Main(string[] args)
    {
        MyLibrary.MyClass.Print();
    }
}

빌드 시 어떤 어셈블리에 대한 "타입"을 바인딩해야 할지 알 수 없어 컴파일 오류가 (당연히) 발생합니다.

Error CS0433 The type 'MyClass' exists in both 'ClassLibrary1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' and 'ClassLibrary2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'

바로 이런 경우에, 어느 한쪽의 네임스페이스 공간을 따로 별칭을 부여하는 것이 가능합니다. 따라서 위의 상황에서는 ClassLibrary1, ClassLibrary2 둘 중의 하나에 대해 csproj 프로젝트 파일에서 Aliases 태그를 부여해 한번 더 구분 가능한 식별자 역할을 추가할 수 있습니다.

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net6.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

  <ItemGroup>
      <ProjectReference Include="..\ClassLibrary1\ClassLibrary1.csproj" />
      <ProjectReference Include="..\ClassLibrary2\ClassLibrary2.csproj">
          <Aliases>Isolated</Aliases>
      </ProjectReference>
  </ItemGroup>

</Project>

위의 예제에서는 ClassLibrary2에 대해 별칭을 지정했는데요, 그럼 아래와 같이 2개의 클래스를 모두 충돌 없이 사용할 수 있습니다.

extern alias Isolated;

using System;

internal class Program
{
    static void Main(string[] args)
    {
        MyLibrary.MyClass.Print();

        Isolated.MyLibrary.MyClass.Output();
    }
}

/* 출력 결과
ClassLibrary1: MyClass
ClassLibrary2: MyClass
*/

그런데, 사실 우리가 인식하지 못했을 뿐이지 네임스페이스에 대한 기본 별칭이 하나 있습니다. 바로 global입니다.

global - :: operator (C# reference)
; https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/namespace-alias-qualifier

이런 관점에서 위의 코드를 다음과 같이 바꿀 수 있습니다.

extern alias Isolated;

using System;

internal class Program
{
    static void Main(string[] args)
    {
        global::MyLibrary.MyClass.Print();

        Isolated::MyLibrary.MyClass.Output();
    }
}

/* 출력 결과
ClassLibrary1: MyClass
ClassLibrary2: MyClass
*/

(첨부 파일은 이 글의 예제 코드를 포함합니다.)




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 1/9/2022]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 



2022-01-28 01시55분
[용현] 좋은자료 감사합니다 꾸벅
[guest]

... [61]  62  63  64  65  66  67  68  69  70  71  72  73  74  75  ...
NoWriterDateCnt.TitleFile(s)
12413정성태11/17/202018542.NET Framework: 970. .NET 5 / .NET Core - UnmanagedCallersOnly 특성을 사용한 함수 내보내기파일 다운로드1
12412정성태11/16/202020692.NET Framework: 969. .NET Framework 및 .NET 5 - UnmanagedCallersOnly 특성 사용파일 다운로드1
12411정성태11/12/202017472오류 유형: 680. C# 9.0 - Error CS8889 The target runtime doesn't support extensible or runtime-environment default calling conventions.
12410정성태11/12/202017623디버깅 기술: 174. windbg - System.TypeLoadException 예외 분석 사례
12409정성태11/12/202019452.NET Framework: 968. C# 9.0의 Function pointer를 이용한 함수 주소 구하는 방법파일 다운로드1
12408정성태11/9/202034698도서: 시작하세요! C# 9.0 프로그래밍 [8]
12407정성태11/9/202019810.NET Framework: 967. "clr!JIT_DbgIsJustMyCode" 호출이 뭘까요?
12406정성태11/8/202020800.NET Framework: 966. C# 9.0 - (15) 최상위 문(Top-level statements) [5]파일 다운로드1
12405정성태11/8/202018679.NET Framework: 965. C# 9.0 - (14) 부분 메서드에 대한 새로운 기능(New features for partial methods)파일 다운로드1
12404정성태11/7/202019302.NET Framework: 964. C# 9.0 - (13) 모듈 이니셜라이저(Module initializers)파일 다운로드1
12403정성태11/7/202018190.NET Framework: 963. C# 9.0 - (12) foreach 루프에 대한 GetEnumerator 확장 메서드 지원(Extension GetEnumerator)파일 다운로드1
12402정성태11/7/202019718.NET Framework: 962. C# 9.0 - (11) 공변 반환 형식(Covariant return types) [1]파일 다운로드1
12401정성태11/5/202018960VS.NET IDE: 153. 닷넷 응용 프로그램에서의 "My Code" 범위와 "Enable Just My Code"의 역할 [1]
12400정성태11/5/202015180오류 유형: 679. Visual Studio - "Source Not Found" 창에 "Decompile source code" 링크가 없는 경우
12399정성태11/5/202018687.NET Framework: 961. C# 9.0 - (10) 대상으로 형식화된 조건식(Target-typed conditional expressions)파일 다운로드1
12398정성태11/4/202018218오류 유형: 678. Windows Server 2008 R2 환경에서 Powershell을 psexec로 원격 실행할 때 hang이 발생하는 문제
12397정성태11/4/202018259.NET Framework: 960. C# - 조건 연산자(?:)를 사용하는 경우 달라지는 메서드 선택 사례파일 다운로드1
12396정성태11/3/202015254VS.NET IDE: 152. Visual Studio - "Tools" / "External Tools..."에 등록된 외부 명령어에 대한 단축키 설정 방법
12395정성태11/3/202018064오류 유형: 677. SSMS로 DB 접근 시 The server principal "..." is not able to access the database "..." under the current security context.
12394정성태11/3/202015677오류 유형: 676. cacls - The Recycle Bin on ... is corrupted. Do you want to empty the Recycle Bin for this drive?
12393정성태11/3/202015328오류 유형: 675. Visual Studio - 닷넷 응용 프로그램 디버깅 시 Disassembly 창에서 BP 설정할 때 "Error while processing breakpoint." 오류
12392정성태11/2/202019856.NET Framework: 959. C# 9.0 - (9) 레코드(Records) [4]파일 다운로드1
12390정성태11/1/202019511디버깅 기술: 173. windbg - System.Configuration.ConfigurationErrorsException 예외 분석 방법
12389정성태11/1/202018687.NET Framework: 958. C# 9.0 - (8) 정적 익명 함수 (static anonymous functions)파일 다운로드1
12388정성태10/29/202017717오류 유형: 674. 어느 순간부터 닷넷 응용 프로그램 실행 시 System.Configuration.ConfigurationErrorsException 예외가 발생한다면?
12387정성태10/28/202018506.NET Framework: 957. C# - static 필드의 정보가 GC Heap에 저장될까요? [3]파일 다운로드1
... [61]  62  63  64  65  66  67  68  69  70  71  72  73  74  75  ...