Не удается загрузить сборку во время выполнения

Это странно...

В моем проекте мне нужно загружать внешние dll во время выполнения. Я делал это часто раньше, и мне казалось, что я наступил на все мины там, где только можно, но этот до сих пор одержал верх над мной.

Это действительно очень просто. Я использую Assembly.LoadFrom("c:\\test\\mytestlibrary.dll"), но Fusion не может найти файл (я получаю FileNotFoundException).

Я, как обычно, просмотрел журналы слияния, и это просто не имеет смысла. Существуют ли какие-либо обстоятельства, которые каким-то образом не позволяют Fusion найти файл, даже если я укажу полный и абсолютный путь к нему? Я подозревал, что рассматриваемой dll нужна какая-то другая сборка, но просмотр журналов слияния не указывает на это. Кроме того, тестовая библиотека не ссылается ни на что, на что не ссылается основная сборка.

Какие-либо предложения?


person Jonas Rembratt    schedule 11.04.2012    source источник
comment
Ссылается ли тестовая сборка на разные версии чего-либо по сравнению с основной сборкой?   -  person Chris Shain    schedule 11.04.2012
comment
Различается ли целевая платформа (32-битная и 64-битная)?   -  person Sascha    schedule 11.04.2012
comment
И наверное глупый вопрос, а вы на 100% уверены, что файл C:\test\mytestlibrary.dll существует?   -  person Chris Shain    schedule 11.04.2012
comment
Странные проблемы, подобные этой, требуют много подробностей в вашем вопросе, поэтому нам не нужно задавать кучу дополнительных вопросов.   -  person Cody Gray    schedule 11.04.2012
comment
Вы действительно проверили наличие файла по точному пути, по которому вы пытаетесь его загрузить?   -  person Alexei Levenkov    schedule 11.04.2012
comment
@CodyGray, я полностью согласен с вами в том, что ОП должен был предоставить более подробную информацию, но я сильно подозреваю, что если бы он задал себе все эти вопросы, он, вероятно, уже нашел бы проблему и не разместил бы вопрос на SO :-)   -  person Darin Dimitrov    schedule 11.04.2012
comment
Ну, все. Проблема необычная, но я не упомянул об одном важном факте: мой код выполняется внутри другого хост-процесса, который я не компилировал, и, кажется, все проистекает из этого факта. По мере того, как я двигался дальше, мне удалось изолировать проблему и, наконец, заставить ее работать. Затем, повторно вводя код, который, казалось бы, не имеет ничего общего с Fusion, я возвращаю проблему. Что ж, боюсь, это просто особый случай, чтобы кто-нибудь помог. В любом случае спасибо и извините за то, что не смогли предоставить более подробную информацию.   -  person Jonas Rembratt    schedule 11.04.2012


Ответы (1)


Возможно, эта запись в блоге Сюзанны Кук даст некоторые подсказки?

Для FileNotFoundException: в нижней части журнала будут указаны пути, которые Fusion пытался исследовать для этой сборки. Если это была загрузка по пути (как в Assembly.LoadFrom()), будет только один путь, и ваша сборка должна быть там, чтобы ее можно было найти. В противном случае ваша сборка должна находиться на одном из перечисленных путей зондирования или в GAC, если ее нужно найти.

Вы также можете получить это исключение, если не удалось загрузить неуправляемую зависимость или внутренний модуль сборки. Попробуйте запустить файл depend.exe для файла, чтобы убедиться, что неуправляемые зависимости могут быть загружены. Обратите внимание, что если вы используете ASP.NET, используемая переменная среды PATH может отличаться от той, которую использует командная строка. Если все они могут быть загружены, попробуйте ildasm.exe в файле, дважды щелкните «МАНИФЕСТ» и найдите записи «.file». Каждый из этих файлов должен находиться в том же каталоге, что и файл, содержащий манифест. -- http://blogs.msdn.com/b/suzcook/archive/2003/05/29/57120.aspx

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

person Jason Kleban    schedule 11.04.2012
comment
Да, я изучил журнал Fusion, но дело в том, что при использовании Assembly.LoadFrom/LoadFile вы указываете точный путь к сборке, поэтому Fusion не нужно начинать зондирование. На самом деле использование Assembly.LoadFrom/LoadFile является распространенным способом решения проблем с зондированием при использовании подхода AppDomain для динамической загрузки сборок. Спасибо, в любом случае. - person Jonas Rembratt; 11.04.2012
comment
Ну она же написала. Вы говорите, что изучили журнал — он исследует (и перечисляет) другие пути зондирования или нет? - person Jason Kleban; 11.04.2012
comment
Нет, он не регистрирует никаких путей, и это так странно. Fusion начинает исследовать (хост) файл app.config, machine.config и т. д., как если бы я инициировал загрузку вызовом AppDomain.Load(), а не Assembly.LoadFile(). - person Jonas Rembratt; 11.04.2012
comment
Вы написали только что LoadFile, но мы говорили о LoadFrom, так что я подозреваю, что это описка. Пробовали ли вы Assembly.LoadFile, который обойти Fusion? - person Jason Kleban; 11.04.2012