programing tip

동일한 네임 스페이스를 가진 두 개의 다른 DLL

itbloger 2020. 11. 24. 07:44
반응형

동일한 네임 스페이스를 가진 두 개의 다른 DLL


네임 스페이스는 같지만 메서드와 형식이 다른 DLL 파일이 두 개 있습니다. 프로젝트에서 두 DLL을 모두 참조하고 해당 메서드와 유형을 사용하려면 어떻게해야합니까?

그런데이 두 DLL에는 이름은 같지만 구현이 다른 일부 메서드와 형식과 고유 한 메서드 및 형식이 있습니다.


특별히 수행해야 할 작업은 없습니다. 참조하고 유형을 사용하기 만하면됩니다. 네임 스페이스는 실제로 불투명 한 형식이 아니기 때문에 문제없이 여러 어셈블리에 걸쳐있을 수 있습니다. 네임 스페이스는 포함 된 모든 유형에 공통 접두사를 추가하는 방법 일 뿐이므로 서로 다른 네임 스페이스에서 동일한 이름의 여러 유형을 가질 수 있습니다. (프레임 워크는 이름이 동일한 것으로 보지 않습니다. 모든 것의 "완전한"이름을보기 때문입니다.이 이름에는 별칭과 네임 스페이스가 앞에 붙어 있습니다.)

드물게 동일한 유형 이름 동일한 네임 스페이스 (예 : 동일한 dll의 서로 다른 버전 2 개)를 가진 2 개의 어셈블리를 참조하는 경우 별칭을 사용하여 지정된 유형에 사용할 어셈블리를 구별 할 수 있습니다. 모든 참조의 기본 별칭은 global이지만 어셈블리를 참조 할 때 (컴파일러 스위치를 사용하거나 Visual Studio의 속성 상자를 사용하여) 어셈블리에 대해 고유 한 별칭을 지정할 수 있으며 extern alias <name>코드 파일의 맨 위에 절이 있습니다. 사용하는 곳-다른 어셈블리의 유형에 액세스합니다.<name>::MyNamespace.Type


정확히 동일한 이름 (이름에 네임 스페이스가 포함됨)을 가진 두 가지 유형이 있지만 다른 DLL에 있고 둘 다 사용하려는 경우이 작업을 수행 할 수 있습니다.

짧은 답변

Acme.Foo2 개의 다른 DLL 을 입력 하고이를 사용하려고합니다. 참조 속성 창 (보기 | 속성 창)에서 참조에 별칭을 지정한 다음 다음과 같이 사용합니다.

extern alias TheAliasYouGaveTheReference

TheAliasYouGaveTheReference::Acme.Foo f = new 
    TheAliasYouGaveTheReference::Acme.Foo();

기본 네임 스페이스는 global모든 C # 프로그램 용 이지만 위에서는 global.

가장 좋은 방법은 처음에 이와 같은 상황 빠지지 않는 것입니다. 두 어셈블리가 모두 고유 한 경우 정확히 동일한 네임 스페이스에 정확히 동일한 이름을 가진 두 가지 유형을 만들지 마십시오. 그러나 때때로 우리는 소스 코드를 제어하지 않기 때문에 그 때 위의 솔루션을 사용할 수 있습니다.

긴 답변

여기 에서 대부분의 기사를 복사하고 있으므로 기사를 더 이상 사용할 수없는 경우 여기에 기록됩니다.

이런 상황에 어떻게 들어가나요?

첫째, 시나리오를 복제하는 방법은 다음과 같습니다.

  1. FooVersion1이라는 C # 클래스 라이브러리 만들기
  2. Class1.cs의 템플릿 코드를 다음으로 바꿉니다.

    using System;
    
    namespace Acme
    {
        public class Foo
        {
            public void Bar()
            {
                Console.WriteLine("Bar");
            }
        }
    }
    
  3. 솔루션 탐색기에서 솔루션을 마우스 오른쪽 단추로 클릭하고 추가 | 새 프로젝트

  4. 현재 프로젝트 저장 (Express에서만 적용 가능)
  5. 새 프로젝트 대화 상자에서 클래스 라이브러리를 선택하고 프로젝트 이름을 FooVersion2로 변경하고 확인을 누릅니다.
  6. Class1.cs의 코드를 다음으로 바꿉니다.

    using System;
    
    namespace Acme
    {
        public class Foo
        {
            public void Bar()
            {
                Console.WriteLine("Bar");
            }
    
            public void Goo()
            {
                Console.WriteLine("Goo");
            }
        }
    }
    

응용 프로그램에서 유형의 사용

이제 우리는 Acme.Foo. 이제 콘솔 응용 프로그램을 만들고 각각을 사용해 보겠습니다.

  1. 솔루션 탐색기에서 솔루션을 마우스 오른쪽 단추로 클릭하고 추가 | 새 프로젝트
  2. 콘솔 애플리케이션을 선택하고 소비자라고합니다.
  3. 소비자를 마우스 오른쪽 버튼으로 클릭하고 '시작 프로젝트로 설정'을 선택합니다.
  4. Right-click on the references node in the Consumer project and select ‘Add Reference’
  5. Click on the projects tab, and multi-select FooVersion1 and FooVersion2 Click OK
  6. Add the following line to Main in the Program type of the Consumer project:

    Acme.Foo f = new Acme.Foo();
    

Build the solution via Ctrl+Shift+B (or F6) Notice that you get two build errors [as shown below]:

enter image description here

The Fix

Here is how we can fix it:

  1. Open solution explorer and select FooVersion1 in the References folder of the Consumer project
  2. Hit F4 (or select View | Properties Window)
  3. Change the Aliases property to FooVersion1
  4. Build the solution
  5. Now everything will build correctly, because Acme.Foo unambiguously refers to FooVersion2
  6. Add the following directive to the top of Program.cs in the Consumer project:

    extern alias FooVersion1;
    
  7. Change the usage of Acme.Foo to:

    FooVersion1::Acme.Foo f = new FooVersion1::Acme.Foo();
    f.Bar();
    
  8. Notice that when you type ‘f.’ the completion list contains only those methods in FooVersion1 of Acme.Foo (notably it does not include Goo)

  9. Build the solution and everything will build correctly
  10. Finally add the following code under f.Bar() in Program.cs of the Consumer project:

    Acme.Foo f2 = new Acme.Foo();
    f2.Goo();
    
  11. Notice that f2’s completion list contains Goo.

  12. Build again using Ctrl+Shift+B and notice that there are still no build errors

you can use the alias feature of the /reference (Import Metadata) (C# Compiler Options) compiler option to solve your problems, read from here for more details

참고URL : https://stackoverflow.com/questions/3672920/two-different-dll-with-same-namespace

반응형