代码之家  ›  专栏  ›  技术社区  ›  HasaniH

Type.IsSubclassOf的行为与预期不符

  •  4
  • HasaniH  · 技术社区  · 15 年前

    我有一个应用程序,它加载程序集并查找属于该应用程序引用的另一个程序集A1中定义的类C1的子类的类型。我在A1中定义了一个类型T,它是C1的一个子类,但是当我使用Assembly.load(…)加载A1时,在T的实例上调用T.IsSubclassOf(typeof(C1)),我得到false。我注意到当前appdomain中有2个程序集A1的实例,如果我从其中一个实例(而不是两个实例)中抓取类型C1,则t.IsSubclassOf(C1)可以工作。我不太明白这种行为,有人能解释吗?此外,我如何修复我的应用程序,使其在加载A1或其他程序集以查找C1的子类型时工作?

    3 回复  |  直到 15 年前
        1
  •  5
  •   Steve Guidi    15 年前

    为了使CLR唯一地标识类型,它在类型标识符中包含程序集信息。您的问题是CLR将A1的两个实例分类为不同的程序集,因此您正在有效地执行:

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

    ... 而不是:

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

    程序集由其名称、版本、区域性和公钥唯一标识。请检查这些值(通过 Assembly.GetName()

        2
  •  2
  •   Irwin    15 年前

    是的,我刚刚用它构建了两个项目,我在一个项目父类和子类中定义:

    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为假。

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

        3
  •  0
  •   Dan Friedman    9 年前

    正在将程序集加载到的AppDomain(使用 Assembly.Load() )可能会引起问题。

    而不是使用 Assembly.Load() AppDomain.CurrentDomain.Load() . 这将确保程序集加载到您可以实际使用它的CurrentDomain中。

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