Сведения о вопросе

Killer

05:15, 6th August, 2020

Теги

c#   .net    

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

Просмотров: 342   Ответов: 3

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

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



  Сведения об ответе

davran

17:06, 10th August, 2020

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

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

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

EDIT:

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


  Сведения об ответе

nYU

20:03, 17th August, 2020

Вы можете использовать элемент <probing> в файле манифеста, чтобы указать среде выполнения искать свои файлы assembly в разных каталогах.

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>


  Сведения об ответе

dumai

01:55, 3rd August, 2020

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

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться