문제

어셈블리 B의 T 형 (참조 유형, 클래스)에 의존하는 어셈블리 A가 있습니다.

나는 어셈블리 A를 소유하지는 않지만 조립 B를 소유하고 있습니다. T 불행히도 (인터페이스가 아님) 운 좋게도 회원을 발견하기 위해 반사를 사용합니다.

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

  1. 반사 방출을 사용하여 B와 T를 생성 할 수 있습니다. 문제 없습니다.
  2. 디스크에 B.dll을 쓸 수 있습니다
  3. A 가이 B.dll에 대해 편집 된 경우 T 동적으로 T를 변경할 수 있습니다.
  4. 그러나 A가 동등한 (손으로 서면 B 및 T)에 대해 컴파일 된 경우 A의 T '는 동일한 어셈블리 이름과 유형 이름을 가지지 만 동적으로 생성 된 것과 같지 않습니다.

그 이유는 유형의 Guid 속성이라고 가정합니다. 디스크에 b.dll을 쓸 때 t 유형은 동적으로 만들 수있는 것과 동일한 안내서를 가지고 있습니다 (멤버를 변경하더라도). 그러나 "다른 동등한"손으로 쓴 유형은 동일한 안내서를 공유하지 않습니다.

요약하면 DLL이 동적으로 생성 된 것과 비슷하지만 정적으로 생성 된 것과 다르면 GUID가 동일합니다. 가이드는 매번 동일합니다 (다시 컴파일하더라도). 동적 유형의 내용을 변경하면 안내서가 동일합니다.

런타임은 두 유형이 동일하다고 어떻게 결정합니까? 이 안내서는 어떻게 만들어 집니까? 이 안내서 및/또는 다른 것을 사용합니까? 어셈블리 a에있는 것과 일치하도록 내 디마크 어셈블리 에이 안내서를 할당 할 수 있습니까?

이 안내서를 정적으로 검토 할 수 있습니까 (반사기 또는 실성으로 볼 수 없었습니다).

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

도움이 되었습니까?

해결책

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

Afaik, type.gid 속성은 유형이 COM 사용에 등록 될 때만 사용됩니다. Guidattribute 클래스와 함께 작동합니다. 따라서 type.gid는 유형의 "신원"과 관련이 없습니다.

런타임이 어셈블리를 찾는 방법에 대한 자세한 내용은 다음과 같습니다. http://msdn.microsoft.com/en-us/library/yx7xezcf.aspx

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top