Type.IsSubclassOf不符合预期行为

4
我有一个应用程序,加载程序集并查找另一个程序集A1中定义的类C1的子类。我在A1中定义了一个名为T的类型,它是C1的子类。但是,当我使用Assembly.Load(...)加载A1后,在T的实例上调用t.IsSubclassOf(typeof(C1))时返回false。我注意到当前AppDomain中存在两个A1程序集的实例,如果我从其中一个实例中提取类型C1,则t.IsSubclassOf(C1)有效,但对于另一个实例则无效。我不太理解这种行为,有人能解释一下吗?此外,如何修复我的应用程序,使其可以处理加载A1或其他程序集以查找C1子类型的情况?
3个回答

5
为了使CLR能够唯一识别类型,它在类型标识符中包含程序集信息。你的问题是CLR将A1的两个实例分类为不同的程序集,因此你实际上正在执行:
A1::T1.IsSubClassOf(A1Copy::C1)  // No relationship between A1 and A1Copy

…而不是:

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

一个程序集通过其名称、版本、区域性和公钥进行唯一识别。请检查应用程序域中这两个程序集实例的这些值(通过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为假。

查看Suzanne Cook关于加载上下文的链接提供了更多的信息:

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


0

我按照你提供的第一个链接,出现了StackOverflowException异常。 - RJ Lohan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接