2009-07-16 9 views
4

J'ai une application qui charge des assemblys et recherche des types qui sont des sous-classes d'une classe C1 définie dans un autre assembly A1 auquel l'application fait référence. J'ai défini un type T dans A1 qui est une sous-classe de C1 mais quand je charge A1 en utilisant Assembly.Load (...) alors j'appelle t.IsSubclassOf (typeof (C1)) sur une instance de T je deviens faux. J'ai remarqué qu'il y a 2 instances de l'assembly A1 dans le domaine actuel et t.IsSubclassOf (C1) fonctionne si j'attrape le type C1 sur l'une des instances mais pas les deux. Je ne comprends pas très bien ce comportement, quelqu'un peut-il expliquer? De plus, comment puis-je corriger mon application pour que cela fonctionne, que ce soit le chargement A1 ou un autre assemblage pour rechercher des sous-types de C1?Type.IsSubclassOf ne se comporte pas comme prévu

Répondre

5

Pour que le CLR identifie de manière unique les types, il inclut les informations d'assemblage dans l'identificateur de type. Votre problème est que le CLR est classifie les deux instances de A1 que différents ensembles, d'où vous exécutez efficacement:

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

... au lieu de:

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

Un ensemble est identifié de manière unique par sa nom, version, culture et clé publique. Veuillez vérifier ces valeurs (via Assembly.GetName()) à partir des deux instances d'assembly dans le domaine de l'application; Je soupçonne qu'il y a une discordance dans l'un des attributs, ce qui amène le CLR à charger l'assemblage incriminé.

+2

Il est basé sur le contexte de la charge pour laquelle il les obtenir ne pas égale. http://blogs.microsoft.co.il/blogs/sasha/archive/2007/03/06/Assembly-Load-Contexts-Subtleties.aspx – user7116

2

Ouais, je viens de construire deux projets, je définis dans une classe parente du projet et de l'enfant:

namespace ClassLibrary1 
{ 
    public class Parent 
    { 
     public string name; 
    } 

    public class Child : Parent 
    { 
    } 
} 

puis essayé de charger les informations:

{ 
     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()); 
    } 

et je me suis isChild1 étant vrai et isChild2 étant faux.

Vérification ce lien par Suzanne Cook sur Contextes Chargement fourni un peu plus de lumière:

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

0

Le AppDomain que vous chargez l'Assemblée en (utilisant Assembly.Load()) pourrait poser des problèmes. Au lieu d'utiliser Assembly.Load(), utilisez AppDomain.CurrentDomain.Load(). Cela garantira que l'assembly est chargé dans CurrentDomain où vous pouvez réellement l'utiliser.

Consultez cet article pour plus d'informations:

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

+0

J'ai suivi votre premier lien et j'ai obtenu une exception StackOverflowException. –

Questions connexes