2009-07-16 9 views
4

어셈블리를로드하고 응용 프로그램에서 참조하는 다른 어셈블리 A1에 정의 된 클래스 C1의 하위 클래스 인 형식을 찾습니다. C1의 하위 클래스 인 A1 형식의 T를 정의했지만 Assembly.Load (...)를 사용하여 A1을로드 한 다음 T 인스턴스에서 t.IsSubclassOf (typeof (C1))를 호출하면 false가 반환됩니다. 나는 현재 appdomain에 어셈블리 A1의 인스턴스가 2 개 있고 t.IsSubclassOf (C1)가 인스턴스 중 하나에서 유형 C1을 가져 왔지만 둘 다 사용하지 않으면 작동 함을 발견했습니다. 나는이 행동을 이해하지 못한다. 누구든지 설명 할 수 있겠는가? 어떻게하면 내 응용 프로그램을 수정하여 A1 또는 일부 다른 어셈블리에서 C1의 하위 유형을 찾든지이 방식이 작동하도록 할 수 있습니까?Type.IsSubclassOf가 예상대로 작동하지 않습니다.

답변

5

CLR이 형식을 고유하게 식별하기 위해 형식 식별자에 어셈블리 정보가 포함됩니다. 귀하의 문제는 CLR은 따라서 효과적으로 실행중인 다른 어셈블리로 A1의 두 인스턴스를 분류된다는 점이다 :

A1::T1.IsSubClassOf(A1Copy::C1) // No relationship between A1 and A1Copy 

... 대신 : 어셈블리가 고유하게 식별됩니다

A1::T1.IsSubClassOf(A1::C1) 

의 이름, 버전, 문화 및 공개 키. app-domain의 두 어셈블리 인스턴스에서이 값을 확인하십시오 (Assembly.GetName() 통해). CLR이 문제가되는 어셈블리를로드하게하는 특성 중 하나에 불일치가 있다고 의심됩니다.

+2

. http://blogs.microsoft.co.il/blogs/sasha/archive/2007/03/06/Assembly-Load-Contexts-Subtleties.aspx – user7116

2

그래, 난 그냥이 두 프로젝트를 구축, 나는 하나 개의 프로젝트 부모와 자식 클래스에 정의 :

namespace ClassLibrary1 
{ 
    public class Parent 
    { 
     public string name; 
    } 

    public class Child : Parent 
    { 
    } 
} 

후 정보를로드하려고 :

{ 
     Type parent = typeof(Parent); 
     Type c1 = typeof(Child); 
     bool isChild1 = (c1.IsSubclassOf(parent).ToString()); 

     Assembly a = Assembly.Load(File.ReadAllBytes("ClassLibrary1.dll")); 
     Type c2 = a.GetType(c1.FullName); 
     bool isChild2 = (c2.IsSubclassOf(parent).ToString()); 
    } 

을 나는 있어 isChild1이 참이고 isChild2가 거짓입니다. 문제가 원인이 될 수 (Assembly.Load() 사용)로 어셈블리를로드하는

http://blogs.msdn.com/suzcook/archive/2003/06/13/57180.aspx

0

응용 프로그램 도메인 :

좀 더 빛을 제공하는로드 컨텍스트에 수잔 쿡이 링크를 체크 아웃.

Assembly.Load() 대신에 AppDomain.CurrentDomain.Load()을 사용하십시오. 이렇게하면 실제로 어셈블리를 사용할 수있는 CurrentDomain에 어셈블리가로드됩니다. 추가 정보를 원하시면이 문서

체크 아웃 : 그것은 그가 같지 않은 그들을 점점 왜로드 컨텍스트를 기반으로

http://blogs.microsoft.co.il/blogs/sasha/archive/2007/03/06/Assembly-Load-Contexts-Subtleties.aspx

+0

첫 번째 링크를 따라 StackOverflowException이 발생했습니다. –

관련 문제