【问题标题】:Type.IsSubclassOf does not behave as expectedType.IsSubclassOf 的行为不符合预期
【发布时间】:2009-07-16 19:08:25
【问题描述】:

我有一个应用程序,它加载程序集并查找作为该应用程序引用的另一个程序集 A1 中定义的类 C1 的子类的类型。我在 A1 中定义了一个类型 T,它是 C1 的子类,但是当我使用 Assembly.Load(...) 加载 A1 然后在 T 的实例上调用 t.IsSubclassOf(typeof(C1)) 时,我得到了错误。我注意到当前 appdomain 中有 2 个程序集 A1 实例,如果我从其中一个实例中获取类型 C1 而不是两者都获取类型 C1,则 t.IsSubclassOf(C1) 可以工作。我不太明白这种行为,谁能解释一下?此外,如何修复我的应用程序,以便无论加载 A1 还是其他程序集以查找 C1 的子类型都可以正常工作?

【问题讨论】:

    标签: c# .net-3.5 assemblies appdomain


    【解决方案1】:

    为了让 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 为真,isChild2 为假。

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

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

    【讨论】:

      【解决方案3】:

      您将程序集加载到的 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

      【讨论】:

      • 我点击了你的第一个链接,得到了 StackOverflowException。
      猜你喜欢
      • 1970-01-01
      • 2017-01-27
      • 2022-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-10
      • 2021-04-09
      相关资源
      最近更新 更多