Assembly.GetType () и typeof () возвращают разные типы? - PullRequest
3 голосов
/ 07 октября 2009

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

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.dll на System.dll, так что я предполагаю, что это как-то связано со свойствами проекта? какой-нибудь переключатель компиляции возможно?

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

Ответы [ 3 ]

8 голосов
/ 07 октября 2009

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

2 голосов
/ 07 октября 2009

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

Этот пример (при компиляции как 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);
    }
}
2 голосов
/ 07 октября 2009

Возможно, вы загружаете две разные копии одной и той же сборки.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...