ResolveEventArgs.RequestingAssembly is Null

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

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

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

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

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

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

1 ответ

Решение

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

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

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

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

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