Загрузка сборок и их зависимостей
Мое приложение динамически загружает сборки во время выполнения из определенных подпапок. Эти сборки собираются с зависимостями от других сборок. Среда выполнения пытается загрузить их из каталога приложений. Но я хочу поместить их в каталог модулей.
Есть ли способ сообщить runtime, что dlls находятся в отдельной подпапке?
Ответы
Ответ 1
Один хороший подход, который я использовал в последнее время, - это добавить обработчик событий для события AppDomain AssemblyResolve.
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler);
Затем в методе обработчика событий вы можете загрузить сборку, которую пытались решить, используя один из элементов Assembly.Load, Assembly.LoadFrom переопределяет и возвращает его из метода.
EDIT:
Основываясь на вашей дополнительной информации, я думаю, что используя вышеприведенную технику, специально разрешая ссылки на сборку самостоятельно, это единственный реальный подход, который будет работать без реструктуризации вашего приложения. То, что это дает вам, заключается в том, что местоположение каждой сборки, которую CLR не может решить, может быть определено и загружено вашим кодом во время выполнения... Я использовал это в аналогичных ситуациях как для подключаемых архитектур, так и для целостности ссылки на сборку сканирующего инструмента.
Ответ 2
Вы можете использовать элемент <probing>
в файле манифеста, чтобы сообщить Runtime посмотреть в разных каталогах для своих файлов сборки.
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>
Ответ 3
Вы можете использовать элемент <codeBase>
, найденный в файле конфигурации приложения. Дополнительная информация о " Поиск сборки через кодовые базы или тестирование.
Ну, загруженная сборка не имеет файл конфигурации приложения.
Хорошо, если вы знаете конкретные папки во время выполнения, вы можете использовать Assembly.LoadFrom.