Загрузка сборок и их зависимостей
Мое приложение динамически загружает сборки во время выполнения из определенных подпапок. Эти сборки скомпилированы с зависимостями от других сборок. Среда выполнения пытается загрузить их из каталога приложения. Но я хочу поместить их в каталог модулей.
Есть ли способ сообщить среде выполнения, что библиотеки DLL находятся в отдельной подпапке?
3 ответа
Один хороший подход, который я использовал в последнее время, заключается в добавлении обработчика событий для события AssemblyResolve в AppDomain.
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler);
Затем в методе обработчика событий вы можете загрузить сборку, которую пытались разрешить, используя одно из переопределений Assembly.Load, Assembly.LoadFrom, и вернуть его из метода.
РЕДАКТИРОВАТЬ:
Основываясь на вашей дополнительной информации, я думаю, что использование вышеописанной техники, в частности, собственное разрешение ссылок на сборку, - это единственный реальный подход, который будет работать без реструктуризации вашего приложения. Это дает вам то, что местоположение каждой сборки, которую CLR не может разрешить, может быть определено и загружено вашим кодом во время выполнения... Я использовал это в аналогичных ситуациях как для подключаемых архитектур, так и для целостности ссылки на сборку. сканирующий инструмент.
Вы можете использовать <probing>
элемент в файле манифеста, чтобы сообщить среде выполнения о поиске файлов сборки в разных каталогах.
http://msdn.microsoft.com/en-us/library/823z9h8w.aspx
например:
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="bin;bin2\subbin;bin3"/>
</assemblyBinding>
</runtime>
</configuration>
Вы можете использовать <codeBase>
элемент найден в файле конфигурации приложения. Более подробная информация о " Нахождении сборки через кодовые базы или зондирование".
Ну, загруженная сборка не имеет файла конфигурации приложения.
Хорошо, если вы знаете конкретные папки во время выполнения, вы можете использовать Assembly.LoadFrom.