2009-10-06 7 views
3

Supposons que vous êtes donné un ensemble Class.dll compilé à partir du code simple suivant:Assembly.GetType() et typeof() retournent des types différents?

namespace ClassLibrary 
{ 
    public class Class 
    { 
    } 
} 

prennent en considération un autre projet avec ce qui précède Class.dll comme référence du projet et avec le code suivant:

Assembly assembly = Assembly.LoadFrom(@"Class.dll"); 

Type reflectedType = assembly.GetType("ClassLibrary.Class"); 
Type knownType = typeof(ClassLibrary.Class); 

Debug.Assert(reflectedType == knownType); 

L'assertion échoue, et je ne comprends pas pourquoi. L'assertion réussit si je remplace le ClassLibrary.Class avec, disons, la classe System.Text.RegularExpressions.Regex et Class.dll avec System.dll, donc je devine qu'il a quelque chose à voir avec les propriétés du projet ? un commutateur de compilation peut-être?

Merci à l'avance

Répondre

8

Le problème est les contextes de chargement: les assemblys chargés via .LoadFrom sont conservés dans une "pile" différente de celles chargées par Fusion (.Load). Les types sont en fait différents du CLR. Vérifiez this link pour plus de détails d'un architecte CLR.

+0

Vous cloué - en utilisant Assembly.Load() résolu la question. Merci beaucoup! –

2

Vous chargez probablement deux copies différentes du même ensemble.

Comparez knownType.Assembly à reflectedType.Assembly dans le débogueur, et regardez les chemins et les versions.

2

J'imagine que vous ne référencez pas le même assemblage que vous chargez à partir du disque.

Cet exemple (lorsque compilé comme Test.exe) fonctionne très bien:

using System; 
using System.Reflection; 

class Example 
{ 
    static void Main() 
    { 
     Assembly assembly = Assembly.LoadFrom(@"Test.exe"); 

     Type reflectedType = assembly.GetType("Example"); 
     Type knownType = typeof(Example); 

     Console.WriteLine(reflectedType == knownType); 
    } 
} 
+0

est une application mvc asp.net sans référence externe à d'autres bibliothèques de classes. –

Questions connexes