Type.GetType не может создать тип из уже загруженной сборки - PullRequest
7 голосов
/ 24 октября 2010

У меня есть программа, которая загружает сборку, используя метод Asssembly.LoadFrom. Некоторое время спустя я пытаюсь использовать Type.GetType для создания типа из этой сборки (используя AssemblyQualifiedName), но метод возвращает null. Если я установлю исключение, он скажет

Не удалось загрузить файл или сборку '...' или одна из его зависимостей. Система не могу найти указанный файл.

Но я уверен, что точно такая же сборка уже загружена (это показано в списке AppDomain.CurrentDomain.GetAssemblies()).

Кто-нибудь имеет представление, что может быть не так и / или как решить эту проблему?

Ответы [ 2 ]

11 голосов
/ 24 октября 2010

Чтобы понять, почему это не работает, вам нужно понять проблему «загрузки контекстов».Type.GetType смотрит только на контекст «Load».Сборка, загруженная в память, находилась в контексте «LoadFrom».

Единственный способ действительно получить привязки в контексте загрузки для просмотра сборок в контексте загрузки - это использовать событие AssemblyResolve и записать код вверните правильную сборку.Событие AssemblyResolve запускается непосредственно перед тем, как не удается выполнить привязку, и поиск всех других сборок не удался.

Дополнительные сведения о контекстах загрузки и проблемах, возникающих при использовании LoadFrom, см. По следующим ссылкам.

MSDN -http://msdn.microsoft.com/en-us/library/dd153782.aspx
AssemblyResolve - http://msdn.microsoft.com/en-us/library/system.appdomain.assemblyresolve.aspx
Сюзанна Кук - http://blogs.msdn.com/b/suzcook/archive/2003/05/29/57143.aspx

6 голосов
/ 24 октября 2010

Если вы можете получить сборку, используя Assembly.LoadFrom, то вы можете получить тип, выполнив:

        Assembly assembly = Assembly.LoadFrom("whatever");
        Type myType = assembly.GetType("typeName")

Assembly.GetType имеет другие перегрузки, которые вы можете узнать о здесь

...