Почему Type.GetType () работает, а Assembly.GetType () не работает? - PullRequest
6 голосов
/ 12 сентября 2011

Я пытаюсь найти тип во время выполнения из списка сборок; мой код примерно такой:

foreach (Assembly assembly in assembliesToSearch)
{
    Type t = assembly.GetType(assemblyName);
    if (t != null)
    {
        return t;
    }
}

, и у меня проблема в том, что t всегда принимает значение null. Играя с отладчиком и промежуточным окном в VS2010, я заметил следующее, когда ставил точку останова внутри цикла:

Type.GetType(typeof(MyNamespace.MyClass).AssemblyQualifiedName)

работает нормально, но

assembly.GetType(typeof(MyNamespace.MyClass).AssemblyQualifiedName)

нет (когда сборка - это сборка, которая, как мне известно, содержит искомый класс - в отладчике я могу поставить часы на сборку. GetTypes (), найдите класс, который я пытаюсь создать, и вызовите assembly.GetType ("MyNamespace.MyClass, MyNamespace")).

Кто-нибудь знает, почему поиск всех сборок с использованием Type.GetType () работает, а поиск сборки, которая, как мне известно, содержит тип с использованием assembly.GetType () - нет?

1 Ответ

10 голосов
/ 12 сентября 2011

Из документов MSDN для этих двух методов Type.GetType() ожидает имя типа * 1005 с указанием сборки, тогда как Assembly.GetType() ожидает полное название типа . Это не одно и то же.

typeof(MyNamespace.MyClass).AssemblyQualifiedName оценивается как имя типа, уточненное сборкой (что-то вроде MyNamespace.MyClass, MyAssembly, Version=1.0.0.0, Culture=neutral), поэтому оно не работает с вызовом Assembly.GetType(), который ожидает строку в формате MyNamespace.MyClass.

Вероятно, это связано с тем, что когда вы передаете полное имя сборки вызову Assembly.GetType(), он ищет тип в сборке, полное имя которого соответствует указанному вами. Он не может его найти, поэтому вы получите null возвращено. Это не относится к вызову Type.GetType(), так как он ожидает получить имя типа с указанием сборки и может найти как сборку, так и тип.


Что стоит отметить:

Если вы «пытаетесь найти тип во время выполнения из списка сборок», как вы говорите, вам, вероятно, лучше использовать вызов Assembly.GetType() для каждой сборки в списке и передавать полное имя типа. Type.GetType(), скорее всего, будет использовать ссылки текущей сборки для разрешения типа, поэтому, если тип существует в сборке, которая не является ссылкой, он не будет найден.

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