2012-02-29 3 views
3

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

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

я могу загрузить someExtention с помощью отражения. Проблема возникает, когда во время исполнения someExtention ищет itsDependency. Точечная сеть выглядит в папке BIN. Он не находит его там. Событие AssemblyResolve Appdomain поднято ...

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

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

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

ответ

5

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

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

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

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

+0

Вы правы. LoadFrom() генерирует события, у которых есть свойство RequestingAssembly, тогда как 'Assembly.Load (AssemblyName.GetAssemblyName (путь)) не работает. Я не понимаю, почему, но мне пришлось переключать – ekkis

+0

Эта строка спасла мне много времени «при динамической загрузке сборок имя папки не должно совпадать с именем сборки». Я также заметил, что RequestingAssembly имеет значение null в событии resolver в этом сценарии. Microsoft должна предупредить об этом на страницах msdn для LoadFrom()! – Makolyte