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 будет содержать запрашивающее свойство сборки. откуда пользовательский код может легко определить целевой путь. тогда пользовательский код может загрузить зависимость.