2013-06-18 2 views
2

저는 플러그인 유형의 아키텍처를 구현하기위한 코드를 작성하고 있습니다. 인터페이스를 정의했고 IThing이라는 이름 공간을 플러그인으로 사용하기 위해 MyStuff이라는 이름 공간을 사용하고 DLL에서 플러그인의 인스턴스를 동적으로 생성하는 코드도 있습니다..Net 인터페이스가 동등한 것으로 간주되는시기는 언제입니까?

if (typeof(IThing).IsAssignableFrom(instType)) 

이 모두 잘하고 인터페이스 즉를 참조, 내 자신의 코드에 무언가에 의해 구현 될 때 작동 확인 : 내 코드는 함께 무엇을 발견 테스트 궁극적 통해 클래스, 필드와 메소드를 노출보고하여이를 수행 어셈블리에 MyStuff.IThing 정의를 제공합니다.

다른 국가의 다른 회사의 다른 개발자가 플러그 가능 구성 요소를 쓰고 있습니다.

MyStuff.IThing에 대한 인터페이스 정의 (예 : C# 소스)를 개발자에게 보냈으며 코드에 포함 시켰습니다.

먼저 문제는 그의 구성 요소가 MyStuff.IThing을 구현했지만 위의 IsAssignableFrom 테스트를 통과하지 못한다는 점입니다. 실패의 이유는 동일한 네임 스페이스를 갖고 인터페이스 정의가 변경되지 않았더라도 다른 어셈블리 (자연스럽게)에 인터페이스 정의가 있다는 것입니다. 여기에있는 해결책은 간단합니다. 인터페이스를 포함하는 어셈블리 DLL을 보내는 것입니다.

내 질문은 이것입니다 : 네임 스페이스가 일치하고 인터페이스 정의가 동일하다면 어떤 어셈블리가 발견되는 것이 중요할까요? 어셈블리 A에 MyStuff.IThing이 어셈블리 B에 MyStuff.IThing과 완전히 동일한 인터페이스 정의가 포함되어있는 경우 MyStuff.IThing 인스턴스로 작업하려는 응용 프로그램의 목적을 위해 이러한 어셈블리를 교환 할 수없는 이유는 무엇입니까?

+0

어셈블리 이름은 형식을 식별하는 요소의 일부이므로 중요합니다. –

답변

3

네임 스페이스가 일치하고 인터페이스 정의가 동일한 경우 왜 어떤 어셈블리가 발견되는 것이 중요합니까?

이러한 인터페이스를 동일하게 취급하면 고정 된 항목 (예 : 규정 된 이름 및 어셈블리)을 비교하는 것이 아니라 인터페이스를 비교하는 것이 더 어려워집니다. CLR은 정규화 된 이름을 비교해야합니다. 모든 속성 및 모든 메서드 목록 및 해당 인수 유형이 재귀적일 수 있습니다. 그렇게하는 것은 매우 어렵습니다. 특히 일관되게 수행하고 클래스와 struct을 유사한 비교 체계에 포함하려는 경우 더욱 그렇습니다.

참고 : 다른 국가의 개발자와 DLL을 공유하는 경우 어셈블리에 strong name이 있는지 확인하십시오. 이렇게하면 동일한 어셈블리에 연결하고 초기에 불일치를 감지 할 수 있습니다. 예를 들어 인터페이스를 변경했지만 다른 개발자가 이전 DLL로 컴파일 된 플러그인을 보내면 플러그인이로드되지 않습니다.

+0

좋은 지적, 고마워. 나는 방법, 속성 등의 비교가 이루어지고 있다고 가정했다. –

0

.NET에서는 속성과 형식을 확인하지 않으며 동등한 결론을 내리지 않습니다.

가장 간단한 방법은 인터페이스를 클래스 라이브러리에 넣고 해당 DLL을 인터페이스를 구현하려는 사람들과 공유하는 것입니다.

관련 문제