我有一个应用程序,它加载程序集并查找作为应用程序引用的另一个程序集 A1 中定义的类 C1 的子类的类型。我在 A1 中定义了一个类型 T,它是 C1 的子类,但是当我使用 Assembly.Load(...) 加载 A1 时,然后在 TI 的实例上调用 t.IsSubclassOf(typeof(C1)) 得到 false。我注意到当前 appdomain 中有 2 个程序集 A1 实例,如果我从其中一个实例中获取类型 C1 而不是两个实例,则 t.IsSubclassOf(C1) 可以工作。我不太明白这种行为,谁能解释一下?此外,我如何修复我的应用程序,以便无论加载 A1 还是其他程序集以查找 C1 的子类型,它都能正常工作?
问问题
3779 次
3 回答
5
为了让 CLR 唯一标识类型,它在类型标识符中包含了程序集信息。您的问题是 CLR 将 A1 的两个实例分类为不同的程序集,因此您正在有效地执行:
A1::T1.IsSubClassOf(A1Copy::C1) // No relationship between A1 and A1Copy
... 代替:
A1::T1.IsSubClassOf(A1::C1)
程序集由其名称、版本、文化和公钥唯一标识。Assembly.GetName()
请从应用程序域中的两个程序集实例中检查这些值(通过);我怀疑其中一个属性不匹配,这导致 CLR 加载有问题的程序集。
于 2009-07-16T19:42:36.467 回答
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 关于加载上下文的链接提供了更多信息:
于 2009-07-16T20:15:34.280 回答
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
于 2011-04-14T22:57:33.537 回答