我有一个应用程序可以加载程序集并查找类型,该类型是应用程序引用的另一个程序集A1中定义的类C1的子类。我在A1中定义了一个类型T,它是C1的一个子类,但是当我使用Assembly.Load(...)加载A1时,然后在T的一个实例上调用t.IsSubclassOf(typeof(C1))。我注意到,在当前appdomain中有A1实例的2个实例,如果我从其中一个实例中获取类型C1,但不能同时实现,则t.IsSubclassOf(C1)可以工作。我不太了解这种行为,任何人都可以解释吗?更进一步,我该如何修复我的应用程序,以便在加载A1或其他程序集以查找C1的子类型时起作用?Type.IsSubclassOf的行为不如预期
4
A
回答
5
为了让CLR唯一地识别类型,它在类型标识符中包含程序集信息。你的问题是,CLR被分类A1的两个实例为不同的组件,因此您可以有效执行:
A1::T1.IsSubClassOf(A1Copy::C1) // No relationship between A1 and A1Copy
...而不是:
A1::T1.IsSubClassOf(A1::C1)
的组件由唯一的标识名称,版本,文化和公钥。请检查应用程序域中这两个程序集实例的值(通过Assembly.GetName()
);我怀疑其中一个属性存在不匹配,导致CLR加载违规的程序集。
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为true,isChild2为false。
检查出上加载上下文这个环节由苏珊娜·库克提供了一些更多的光线:
0
,你加载组装成(使用Assembly.Load()
)可能会导致问题的AppDomain中。
而不是使用Assembly.Load()
,请使用AppDomain.CurrentDomain.Load()
。这将确保程序集加载到您可以实际使用它的CurrentDomain中。
退房本文的详细信息:
http://blogs.microsoft.co.il/blogs/sasha/archive/2007/03/06/Assembly-Load-Contexts-Subtleties.aspx
+0
我跟着你的第一个链接,并得到一个StackOverflowException。 – 2014-03-31 09:23:50
相关问题
- 1. Array.splice()行为不如预期
- 2. MySQL的行为不预期
- 3. grep的行为不预期
- 4. TextWatcher的行为不如预期
- 5. SetValue的行为不如预期
- 6. isnumeric&isdecimal的行为不如预期
- 7. .c_str()的行为不如预期
- 8. 客户ListView的行为不如预期
- 9. C++指针的行为不如预期
- 10. Zip -x的行为不如预期
- 11. Php preg_match_all的行为不如预期
- 12. ng - 如果行为不如预期
- 13. v-如果行为不如预期
- 14. Angular 2路由行为不如预期
- 15. Android碎片行为不如预期
- 16. Perl命令行为不如预期?
- 17. Preg_replace行为不如我预期
- 18. IList比较行为不如预期
- 19. Type.IsSubclassOf()不适用于AppDomains?
- 20. Mayavi/IPython shell不能预期的行为
- 21. 的ActiveResource客户行为不预期
- 22. htaccess的行为不象预期
- 23. angularjs - html5mode不是预期的行为
- 24. cudaEventElapsedTime不是预期的行为
- 25. window.Owner(行为预期)
- 26. 预期行为1.9.1
- 27. shm_unlink的预期行为?
- 28. 为什么我的if语句的行为不如预期
- 29. 使用jquery进行表单验证的行为不如预期
- 30. 为什么std :: chrono :: time_point的行为不如预期?
它是基于Load上下文为什么他让他们为不相等。 http://blogs.microsoft.co.il/blogs/sasha/archive/2007/03/06/Assembly-Load-Contexts-Subtleties.aspx – user7116 2009-07-16 20:25:45