Загрузка сборок и их зависимостей

Мое приложение динамически загружает сборки во время выполнения из определенных подпапок. Эти сборки скомпилированы с зависимостями от других сборок. Среда выполнения пытается загрузить их из каталога приложения. Но я хочу поместить их в каталог модулей.

Есть ли способ сообщить среде выполнения, что библиотеки 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.

Другие вопросы по тегам