Загрузка сборок и их зависимостей - PullRequest
21 голосов
/ 22 августа 2008

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

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

Ответы [ 3 ]

18 голосов
/ 22 августа 2008

Один хороший подход, который я использовал в последнее время, - это добавление обработчика событий для события AssemblyResolve в AppDomain.

AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler);

Затем в методе обработчика событий вы можете загрузить сборку, которую пытались разрешить, используя одно из переопределений Assembly.Load, Assembly.LoadFrom, и вернуть его из метода.

EDIT:

Основываясь на вашей дополнительной информации, я думаю, что с помощью описанной выше техники конкретное разрешение ссылок на сборку самостоятельно - это единственный реальный подход, который будет работать без реструктуризации вашего приложения. Это дает вам то, что местоположение каждой сборки, которую CLR не может разрешить, может быть определено и загружено вашим кодом во время выполнения ... Я использовал это в аналогичных ситуациях как для подключаемых архитектур, так и для целостности ссылки на сборку. сканирующий инструмент.

4 голосов
/ 22 августа 2008

Вы можете использовать элемент <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>
1 голос
/ 22 августа 2008

Вы можете использовать элемент <codeBase>, найденный в файле конфигурации приложения. Более подробная информация о " Нахождение сборки с помощью кодовых баз или зондирования ".

Ну, загруженная сборка не имеет файл конфигурации приложения.

Хорошо, если вы знаете конкретные папки во время выполнения, вы можете использовать Assembly.LoadFrom .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...