2009-04-12 3 views
1

어셈블리 B에서 (정적으로) 형식 T (참조 형식, 클래스)에 종속되는 어셈블리 A가 있습니다..NET 런타임은 두 유형이 동일하다고 어떻게 판별합니까?

어셈블리 A를 소유하고 있지 않지만 자체 어셈블리 B를 소유하고 있습니다. T는 불행히도 실제 형식이 아닙니다. 운좋게도 A는 리플렉션을 사용하여 멤버를 찾습니다.

동적으로 B (및 T)를 만들 수 있기를 원합니다. 유일한 중요한 항목은 A와 B가 동적으로 생성 된 (멤버가 아닌) A가 컴파일 될 때 정적으로 컴파일 된 멤버와 "동등한"멤버인지 확인해야한다는 것입니다.

  1. 반사 Emit을 사용하여 B와 T를 만들 수 있습니다. 문제 없습니다. A는 A는 (손으로 쓴 B 및 T)를 상당에 대해 컴파일 된 경우 그때 동적 T, 아무 문제 그러나
  2. 을 변경할 수 있습니다이 B.DLL에 대해 컴파일 된 경우
  3. 나는 디스크
  4. 에 B.DLL을 쓸 수 있습니다 A의 T '는 동일한 어셈블리 이름과 유형 이름을 가지지 만 동적으로 생성 된 이름과 같지는 않습니다.

그 이유는 해당 유형의 GUID 속성이라고 가정합니다. 디스크에 B.dll을 쓸 때 T 유형은 동적으로 만들 수있는 것과 동일한 GUID를가집니다 (구성원을 변경하더라도). 그러나 "이와 동등한"손으로 쓴 유형은 동일한 GUID를 공유하지 않습니다.

dll은 동적으로 생성되지만 dll이 정적으로 생성 된 것과 다른 경우 요약입니다. GUID는 매번 동일합니다 (다시 컴파일하더라도). 동적 유형의 내용을 변경하면 GUID가 동일합니다.

런타임에서 두 유형이 같은지 어떻게 결정합니까? 이 GUID는 어떻게 생성됩니까? 그것은이 GUID 및/또는 다른 것을 사용합니까? 이 GUID를 내 dimamic 어셈블리에 할당하여 어셈블리 A의 GUID와 일치시킬 수 있습니까?

이 GUID를 정적으로 검사 할 수 있습니까 (리플렉터 또는 ildasm에서는이 GUID를 볼 수 없었습니다).

참고 : 어셈블리가 서명되지 않았다고 가정합니다.

답변

4

.NET 런타임은 어셈블리 이름, 버전, 강력한 이름 (있는 경우) 및 경우에 따라 참조 된 어셈블리를 찾기위한 문화권을 사용합니다. 어셈블리 A가 다른 어셈블리 B를 참조하는 경우 언급 된 특성이 완전히 동일하면 B를 다른 어셈블리로 바꿀 수 있습니다. B에 강력한 이름이 있으면 어셈블리에 서명하는 데 사용 된 키 파일을 소유하고있는 경우에만 동일한 강력한 이름으로 다른 어셈블리를 만들 수 있습니다.

AFAIK, Type.GUID 속성은 형식을 COM 용으로 등록한 경우에만 사용됩니다. 그것은 GuidAttribute 클래스와 함께 작동합니다. 따라서 Type.GUID는 유형의 "신원"과 아무런 관련이 없습니다.

런타임에서 어셈블리의 위치를 ​​찾는 방법에 대한 자세한 내용은 여기를 참조하십시오. http://msdn.microsoft.com/en-us/library/yx7xezcf.aspx

관련 문제