ResolveEventArgs.RequestingAssembly is Null - PullRequest
3 голосов
/ 29 февраля 2012

Я пытаюсь загружать сборки динамически через Reflection.У меня есть структура папок, как это:

project
  \-- BIN
       |-- myApp.exe
       |-- SOMEEXTENTION1
       |    |-- someExtention1.dll
       |    \-- itsDependency1.dll
       |         
       |-- SOMEEXTENTION2
            |-- someExtention2.dll
            \-- itsDependency2.dll

Я могу загрузить SomeExtention , используя отражение.Проблема возникает, когда во время выполнения someExtention ищет itsDependency .Dot net выглядит в папке BIN.Там его нет.Событие AssemblyDesolve в Appdomain вызвано ...

Я перехватываю это событие.В ResolveEventArgs я получаю имя сборки, которую нужно загрузить.Проблема в том, что я не получаю RequestingAssembly.это свойство ResolveEventArgs всегда пусто.Мне нужна запрашивающая сборка, чтобы я мог смотреть прямо в ее собственной папке EXTN.без этого мне придется искать во всех папках EXTN, которые в моем случае могут быть довольно большими.

У RequestingAssembly есть свойство Location, которое согласно этой статье msdn содержит путь к физическому файлу. эта статья также описывает ситуацию, когда это свойство может иметь значение Nothing.Я не понимаю обсуждаемый там Load-Context.

Любая помощь будет полезна ...

1 Ответ

4 голосов
/ 20 апреля 2012

Из того, что я обнаружил в результате экспериментов (опять же, в результатах поиска нет поддержки), при динамической загрузке сборок имя папки не должно совпадать с именем сборки.я не знаю точно, что происходит тогда, но что-то внутри механизма загрузчика становится бесполезным.

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

с другой стороны, я обнаружил, что если при загрузке не удается разрешить зависимость и инициируется событие AssemblyResolve, то запрашивающая сборка не будет доступна.это означает, что путь к запрашивающей сборке не может быть определен.

вместо использования load-from, когда я использовал метод LoadFile, зависимости НЕ автоматически разрешаются из подпапки.Скорее событие AssemblyResolve запущено.в этом случае, хотя ResolveEventArgs будет содержать запрашивающее свойство сборки.откуда пользовательский код может легко определить целевой путь.тогда пользовательский код может загрузить зависимость.

...