동일한 네임 스페이스를 가진 두 개의 다른 DLL
네임 스페이스는 같지만 메서드와 형식이 다른 DLL 파일이 두 개 있습니다. 프로젝트에서 두 DLL을 모두 참조하고 해당 메서드와 유형을 사용하려면 어떻게해야합니까?
그런데이 두 DLL에는 이름은 같지만 구현이 다른 일부 메서드와 형식과 고유 한 메서드 및 형식이 있습니다.
특별히 수행해야 할 작업은 없습니다. 참조하고 유형을 사용하기 만하면됩니다. 네임 스페이스는 실제로 불투명 한 형식이 아니기 때문에 문제없이 여러 어셈블리에 걸쳐있을 수 있습니다. 네임 스페이스는 포함 된 모든 유형에 공통 접두사를 추가하는 방법 일 뿐이므로 서로 다른 네임 스페이스에서 동일한 이름의 여러 유형을 가질 수 있습니다. (프레임 워크는 이름이 동일한 것으로 보지 않습니다. 모든 것의 "완전한"이름을보기 때문입니다.이 이름에는 별칭과 네임 스페이스가 앞에 붙어 있습니다.)
드물게 동일한 유형 이름 과 동일한 네임 스페이스 (예 : 동일한 dll의 서로 다른 버전 2 개)를 가진 2 개의 어셈블리를 참조하는 경우 별칭을 사용하여 지정된 유형에 사용할 어셈블리를 구별 할 수 있습니다. 모든 참조의 기본 별칭은 global
이지만 어셈블리를 참조 할 때 (컴파일러 스위치를 사용하거나 Visual Studio의 속성 상자를 사용하여) 어셈블리에 대해 고유 한 별칭을 지정할 수 있으며 extern alias <name>
코드 파일의 맨 위에 절이 있습니다. 사용하는 곳-다른 어셈블리의 유형에 액세스합니다.<name>::MyNamespace.Type
정확히 동일한 이름 (이름에 네임 스페이스가 포함됨)을 가진 두 가지 유형이 있지만 다른 DLL에 있고 둘 다 사용하려는 경우이 작업을 수행 할 수 있습니다.
짧은 답변
Acme.Foo
2 개의 다른 DLL 을 입력 하고이를 사용하려고합니다. 참조 속성 창 (보기 | 속성 창)에서 참조에 별칭을 지정한 다음 다음과 같이 사용합니다.
extern alias TheAliasYouGaveTheReference
TheAliasYouGaveTheReference::Acme.Foo f = new
TheAliasYouGaveTheReference::Acme.Foo();
기본 네임 스페이스는 global
모든 C # 프로그램 용 이지만 위에서는 global
.
가장 좋은 방법은 처음에 이와 같은 상황 에 빠지지 않는 것입니다. 두 어셈블리가 모두 고유 한 경우 정확히 동일한 네임 스페이스에 정확히 동일한 이름을 가진 두 가지 유형을 만들지 마십시오. 그러나 때때로 우리는 소스 코드를 제어하지 않기 때문에 그 때 위의 솔루션을 사용할 수 있습니다.
긴 답변
여기 에서 대부분의 기사를 복사하고 있으므로 기사를 더 이상 사용할 수없는 경우 여기에 기록됩니다.
이런 상황에 어떻게 들어가나요?
첫째, 시나리오를 복제하는 방법은 다음과 같습니다.
- FooVersion1이라는 C # 클래스 라이브러리 만들기
Class1.cs의 템플릿 코드를 다음으로 바꿉니다.
using System; namespace Acme { public class Foo { public void Bar() { Console.WriteLine("Bar"); } } }
솔루션 탐색기에서 솔루션을 마우스 오른쪽 단추로 클릭하고 추가 | 새 프로젝트
- 현재 프로젝트 저장 (Express에서만 적용 가능)
- 새 프로젝트 대화 상자에서 클래스 라이브러리를 선택하고 프로젝트 이름을 FooVersion2로 변경하고 확인을 누릅니다.
Class1.cs의 코드를 다음으로 바꿉니다.
using System; namespace Acme { public class Foo { public void Bar() { Console.WriteLine("Bar"); } public void Goo() { Console.WriteLine("Goo"); } } }
응용 프로그램에서 유형의 사용
이제 우리는 Acme.Foo
. 이제 콘솔 응용 프로그램을 만들고 각각을 사용해 보겠습니다.
- 솔루션 탐색기에서 솔루션을 마우스 오른쪽 단추로 클릭하고 추가 | 새 프로젝트
- 콘솔 애플리케이션을 선택하고 소비자라고합니다.
- 소비자를 마우스 오른쪽 버튼으로 클릭하고 '시작 프로젝트로 설정'을 선택합니다.
- Right-click on the references node in the Consumer project and select ‘Add Reference’
- Click on the projects tab, and multi-select FooVersion1 and FooVersion2 Click OK
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]:
The Fix
Here is how we can fix it:
- Open solution explorer and select FooVersion1 in the References folder of the Consumer project
- Hit F4 (or select View | Properties Window)
- Change the Aliases property to FooVersion1
- Build the solution
- Now everything will build correctly, because Acme.Foo unambiguously refers to FooVersion2
Add the following directive to the top of Program.cs in the Consumer project:
extern alias FooVersion1;
Change the usage of Acme.Foo to:
FooVersion1::Acme.Foo f = new FooVersion1::Acme.Foo(); f.Bar();
Notice that when you type ‘f.’ the completion list contains only those methods in FooVersion1 of Acme.Foo (notably it does not include Goo)
- Build the solution and everything will build correctly
Finally add the following code under f.Bar() in Program.cs of the Consumer project:
Acme.Foo f2 = new Acme.Foo(); f2.Goo();
Notice that f2’s completion list contains Goo.
- 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
'programing tip' 카테고리의 다른 글
파이썬을 말하는 방법 (0) | 2020.11.24 |
---|---|
생성자가 비어 있거나 생성자가 없음 (0) | 2020.11.24 |
C ++에서 사소하지 않은 생성자는 무엇입니까? (0) | 2020.11.24 |
github에서 저장소 이름을 바꾸는 방법은 무엇입니까? (0) | 2020.11.24 |
Windows에 C로 디렉토리가 있는지 어떻게 확인합니까? (0) | 2020.11.24 |