2010-06-10 6 views
29

C++로 작성되었으며 C# 래퍼가있는 라이브러리를 마이그레이션하는 중입니다. 는 C# 래퍼 (LibWrapper)는 같은 네임 스페이스와 클래스의 집합이 있습니다두 어셈블리에서 같은 이름의 클래스 (의도적으로)

namespace MyNamespace 
    class MyClass 
    class MyOtherClass 

나의 새로운 라이브러리, LibraryCS가 (사용자 요구 사항에 따라) LibWrapper과 같은 네임 스페이스와 클래스 이름을 포함, 그래서도 있습니다

namespace MyNamespace 
    class MyClass 
    class MyOtherClass 

이제 마이그레이션이 완료되었으므로 두 라이브러리를 사용한 결과를 비교하는 테스트를 작성하여 마이그레이션 유효성을 검사하는 중입니다. 그러나 MyNamespace.MyClass을 참조하려고하면 "MyNamespace.MyClass가 LibWrapper와 LibraryCS 모두에 정의되어 있습니다"라는 컴파일러 오류가 발생합니다 (예상대로!).

이 문제를 해결할 수있는 트릭이 있습니까? 동일한 클라이언트 코드에서 다른 어셈블리의 동일한 이름을 가진 두 개의 클래스를 사용할 수 있습니까?

다른 방법으로 테스트 할 수 있습니까?

마이그레이션 된 네임 스페이스의 이름을 MyNamespace2으로 바꾸면 클라이언트 코드를 더 쉽게 마이그레이션 할 수 있습니다.

+0

다른 네임 스페이스에있는 클래스 중 하나에 래퍼를 쓸 수 있습니까? – Goblin

+0

동일한 테스트 코드에서 두 가지를 모두 실행할 수 있다면 허용 될 수 있습니다. 테스트 용으로 만 사용되는 랩퍼입니다. – pgb

답변

54

당신은 다른 어셈블리에서 같은 정규화 된 이름과 유형을 참조하는 extern alias를 사용할 수 있습니다. LibraryCS에 대한 참조를 선택하고 속성 페이지의 별칭을 "global"에서 "LibraryCS"로 업데이트하고 extern alias LibraryCS;을 소스 파일의 맨 위에 추가 한 다음 LibraryCS::MyNamespace.MyClass을 사용하여 LibraryCS의 클래스를 참조 할 수 있습니다. MyNamespace.MyClass 또는 global::MyNamespace.MyClass을 사용하여 LibWrapper의 클래스를 참조하거나 해당 참조에 대한 별칭을 사용할 수 있습니다.

+4

나는 Quartermeister에 동의합니다. 자세한 내용은 아래를 참조하십시오. http://blogs.msdn.com/b/ansonh/archive/2006/09/27/774692.aspx – Kari

0

런타임시 첫 번째 어셈블리를로드 한 다음 리플렉션을 사용하여 인스턴스화하고 메서드를 실행할 수 있습니다. 그런 다음 해당 어셈블리를 언로드하고 두 번째 어셈블리를로드 한 다음 리플렉션을 사용하여 두 번째 어셈블리를 만들고 해당 메서드를 실행합니다.

아마 다음 결과 출력을 비교이 개 별도의 프로세스를 사용하기 쉬운 것 ...

+1

어셈블리를 직접 언로드 할 수는 없으며 AppDomain 만로드 할 수 있습니다. 이렇게하려면 해당 어셈블리와 별도의 appdomain이 필요합니다. –

+0

잘 호출하면 어셈블리를 언로드하기 위해 AppDomain을 다운시켜야합니다. 응답을 편집합니다. –

1

이 질문과 대답을 보니 도움이되었습니다. 같은 사람에 대한 자세한 설명이 필요한 사람들을 위해, 나는 실제로 유용하다고 link을 발견했습니다.

링크에서 추출하십시오. VS IDE 사용 : 하나 개의 애플리케이션

1 단계에서 같은 DLL의 다른 버전을 사용

. 클라이언트 응용 프로그램 솔루션의 dll에 대한 참조를 모두 추가하십시오. 그런 다음 솔루션 탐색기에서 참조 노드 아래에서 첫 번째 (이전 버전) 클래스 라이브러리를 선택합니다.속성 창에서 별칭 필드를 에서으로 oldVer으로 변경하십시오. lly, new N 진보 버전.

2 단계 : 당신이

extern alias oldVer; 
extern alias newVer; 

지금 사용 참조하려는 경우 첫 번째 문으로 아래의 코드를 사용이 도움이

Console.WriteLine(oldVer::MyLibrary.MyClass.method()); 
Console.WriteLine(newVer::MyLibrary.MyClass.method()); 

희망.

관련 문제