어셈블리를로드하고 응용 프로그램에서 참조하는 다른 어셈블리 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가 예상대로 작동하지 않습니다.
답변
CLR이 형식을 고유하게 식별하기 위해 형식 식별자에 어셈블리 정보가 포함됩니다. 귀하의 문제는 CLR은 따라서 효과적으로 실행중인 다른 어셈블리로 A1의 두 인스턴스를 분류된다는 점이다 :
A1::T1.IsSubClassOf(A1Copy::C1) // No relationship between A1 and A1Copy
... 대신 : 어셈블리가 고유하게 식별됩니다
A1::T1.IsSubClassOf(A1::C1)
의 이름, 버전, 문화 및 공개 키. app-domain의 두 어셈블리 인스턴스에서이 값을 확인하십시오 (Assembly.GetName()
통해). CLR이 문제가되는 어셈블리를로드하게하는 특성 중 하나에 불일치가 있다고 의심됩니다.
그래, 난 그냥이 두 프로젝트를 구축, 나는 하나 개의 프로젝트 부모와 자식 클래스에 정의 :
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()
사용)로 어셈블리를로드하는
응용 프로그램 도메인 :
좀 더 빛을 제공하는로드 컨텍스트에 수잔 쿡이 링크를 체크 아웃.
Assembly.Load()
대신에 AppDomain.CurrentDomain.Load()
을 사용하십시오. 이렇게하면 실제로 어셈블리를 사용할 수있는 CurrentDomain에 어셈블리가로드됩니다. 추가 정보를 원하시면이 문서
체크 아웃 : 그것은 그가 같지 않은 그들을 점점 왜로드 컨텍스트를 기반으로
http://blogs.microsoft.co.il/blogs/sasha/archive/2007/03/06/Assembly-Load-Contexts-Subtleties.aspx
첫 번째 링크를 따라 StackOverflowException이 발생했습니다. –
- 1. setPropertiesToFetch가 예상대로 작동하지 않습니다.
- 2. Sed가 예상대로 작동하지 않습니다.
- 3. jQuery.inArray가 예상대로 작동하지 않습니다.
- 4. FLAG_ACTIVITY_NEW_TASK이 예상대로 작동하지 않습니다.
- 5. 프로젝트가 예상대로 작동하지 않습니다.
- 6. DataGridViewCellStyle.ForeColor가 예상대로 작동하지 않습니다.
- 7. dismissModalViewController가 예상대로 작동하지 않습니다.
- 8. 코드가 예상대로 작동하지 않습니다.
- 9. mouseEnabledWhereTransparent가 예상대로 작동하지 않습니다.
- 10. jquery가 예상대로 작동하지 않습니다.
- 11. FB가 예상대로 작동하지 않습니다.
- 12. Document.domain이 예상대로 작동하지 않습니다.
- 13. 링크가 예상대로 작동하지 않습니다.
- 14. Zend_Session_Namespace가 예상대로 작동하지 않습니다.
- 15. clearTimeout이 예상대로 작동하지 않습니다.
- 16. preventDefault - 예상대로 작동하지 않습니다.
- 17. stringByReplacingOccurrencesOfString이 예상대로 작동하지 않습니다.
- 18. initWithNibName 예상대로 작동하지 않습니다.
- 19. form_tag가 예상대로 작동하지 않습니다.
- 20. String.Starts가 예상대로 작동하지 않습니다.
- 21. 정규식이 예상대로 작동하지 않습니다.
- 22. 발신자가 예상대로 작동하지 않습니다.
- 23. 필터가 예상대로 작동하지 않습니다.
- 24. HitTest가 예상대로 작동하지 않습니다.
- 25. Directory.GetFiles가 예상대로 작동하지 않습니다.
- 26. android : layout_gravity가 예상대로 작동하지 않습니다.
- 27. click()이 예상대로 작동하지 않습니다.
- 28. Dictionary.ContainsKey()가 예상대로 작동하지 않습니다.
- 29. 오디오 캡처가 예상대로 작동하지 않습니다.
- 30. 반복 커서가 예상대로 작동하지 않습니다.
. http://blogs.microsoft.co.il/blogs/sasha/archive/2007/03/06/Assembly-Load-Contexts-Subtleties.aspx – user7116