«Правильный» (рекомендуемый MS) способ сделать это, когда необходимо использовать Type.GetType(string)
для типов в сборках, которые находятся не в контексте загрузки, а в контексте загрузки или без контекста, заключается в привязке ксобытие Appdomain.AssemblyResolve
.Следующий код относительно эффективен:
// this resolver works as long as the assembly is already loaded
// with LoadFile/LoadFrom or Load(string) / Load(byte[])
private static Assembly OnAssemblyResolve(object sender, ResolveEventArgs args)
{
var asm = (from a in AppDomain.CurrentDomain.GetAssemblies()
where a.GetName().FullName == args.Name
select a).FirstOrDefault();
if(asm == null)
throw FileNotFoundException(args.Name); // this becomes inner exc
return asm;
}
// place this somewhere in the beginning of your app:
AppDomain.CurrentDomain.AssemblyResolve += OnAssemblyResolve;
Представляется несколько более эффективным создать комбинацию событий AssemblyLoad / Resolve, чтобы сохранить словарь загруженных сборок (используйте имя сборки в качестве ключа).
On Assembly.LoadFile
Существует несколько серьезных недостатков при использовании этого метода. Согласно MSDN :
LoadFile не загружает файлы в контекст LoadFrom и не разрешает зависимости, используя путь загрузки, как это делает метод LoadFrom.
Поэтому, если возможно, не используйте LoadFile.Результирующая сборка загружается в контексте без контекста, который имеет еще больше недостатков, чем контекст загрузки из.Вместо этого используйте Assembly.LoadFrom , и зависимости будут автоматически загружаться из пути загрузки.