Подтвердить что ты не робот

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

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

Есть ли способ сообщить runtime, что dlls находятся в отдельной подпапке?

4b9b3361

Ответ 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.