2009-10-06 1 views
3

Предположим, вы получаете сборку Class.dll скомпилированный из следующего простого кода:Assembly.GetType() и typeof() возвращают разные типы?

namespace ClassLibrary 
{ 
    public class Class 
    { 
    } 
} 

И рассмотрим другой проект с выше Class.dll в качестве ссылки проекта и с помощью следующего кода:

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

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

Debug.Assert(reflectedType == knownType); 

Утверждение терпит неудачу, и я не понимаю, почему.

Утверждение прошло успешно, если я заменил ClassLibrary.Class, скажем, на System.Text.RegularExpressions.Regex class и Class.dll на System.dll, поэтому я предполагаю, что это имеет какое-то отношение к свойствам проекта ? возможно, какой-то компилятор?

Заранее спасибо

ответ

8

Проблема заключается в контекстах загрузки: сборки, загруженные через .LoadFrom, хранятся в другой «куче», чем загруженные Fusion (.Load). Типы на самом деле отличаются от CLR. Проверьте this link для более подробной информации от архитектора CLR.

+0

Вы прибил его - с помощью Assembly.Load() решен вопрос. Большое спасибо! –

2

Вы, вероятно, загружаются две разные копии одного и того же узла.

Сравните knownType.Assembly с reflectedType.Assembly в отладчике и посмотрите пути и версии.

2

Я бы предположил, что вы не ссылаетесь на ту же сборку, которую вы загружаете с диска.

Этот пример (при компиляции, как Test.exe) работает просто отлично:

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

его приложение mpc asp.net без внешней ссылки на другие библиотеки классов. –