2009-07-16 51 views
4

我有一个应用程序可以加载程序集并查找类型,该类型是应用程序引用的另一个程序集A1中定义的类C1的子类。我在A1中定义了一个类型T,它是C1的一个子类,但是当我使用Assembly.Load(...)加载A1时,然后在T的一个实例上调用t.IsSubclassOf(typeof(C1))。我注意到,在当前appdomain中有A1实例的2个实例,如果我从其中一个实例中获取类型C1,但不能同时实现,则t.IsSubclassOf(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) 

的组件由唯一的标识名称,版本,文化和公钥。请检查应用程序域中这两个程序集实例的值(通过Assembly.GetName());我怀疑其中一个属性存在不匹配,导致CLR加载违规的程序集。

+2

它是基于Load上下文为什么他让他们为不相等。 http://blogs.microsoft.co.il/blogs/sasha/archive/2007/03/06/Assembly-Load-Contexts-Subtleties.aspx – user7116 2009-07-16 20:25:45

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。

检查出上加载上下文这个环节由苏珊娜·库克提供了一些更多的光线:

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

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