Почему я могу получить исключение DLL не найден в Vista, но не XP? - PullRequest
2 голосов
/ 14 апреля 2011

У меня есть приложение, которое использует несколько управляемых библиотек. Эти управляемые библиотеки, в свою очередь, полагаются на некоторые неуправляемые библиотеки.

Когда я развертываю приложение на компьютере под управлением XP, оно работает нормально. Когда я делаю то же самое на компьютере под управлением Vista, я получаю исключение DLL not found.

Я пытался выполнить проект установки VS2010 и установщик NSIS, и в обоих случаях он одинаков.

Почему это могло случиться? Что я могу сделать, чтобы обойти это?


Обновление - Дополнительная информация

  1. Оба установщика проверяют установку .NET 4.0 и устанавливают ее при необходимости
  2. Компьютер Vista является 64-разрядным, но установка, как и ожидалось, направляется в папку с программными файлами x86
  3. В обоих случаях у меня есть учетная запись администратора
  4. Библиотеки DLL находятся в том же каталоге, что и исполняемый файл
  5. Насколько я могу судить, файлы копируются в нужный каталог

Обновление 2

  1. Полная ошибка в http://pastebin.ca/2046487
  2. DLL - это Audiere.Net.dll, которая является моей и является управляемой библиотекой.

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


Обновление 3 - материал из Process Monitor

После запуска монитора процесса (спасибо Mehrdad!) Есть несколько записей, которые не имеют статуса «УСПЕХ». Некоторые из них «ИМЯ НЕ НАЙДЕНО», а некоторые «ПУТЬ НЕ НАЙДЕН». (Он даже запрашивает файлы PDB, которые, как я думал, использовались только отладчиком.) Очень трудно понять, какие записи могут привести к фактическому сбою. В любом случае, я загрузил журнал (отфильтрованный, чтобы найти соответствующий путь) на случай, если он что-то значит для кого-либо.


Обновление 4 - добавлены файлы .pdb

Так что я немного отчаялся и включил файлы .pdb в вывод установщика. Я думал, что это будет бесполезно, но на самом деле это привело к более полезной ошибке. Вместо того, чтобы просто сказать, что DLL не найдена, я теперь получаю исключение BadImageFormatException. Поискивая это говорит мне, что это распространенная проблема для двоичных файлов, скомпилированных на x86, но работающих на x64 (как на машине с Vista).

Предлагаемое решение - принудительно настроить его на x86, но Audiere.Net.dll уже был. Может ли ошибка заключаться в библиотеке, которую она упаковывает?

Ответы [ 7 ]

2 голосов
/ 14 апреля 2011

Может быть, существует какое-то перенаправление, которое фактически не позволяет вашему приложению установить в нужную папку?

Нам понадобится немного больше подробностей, но вы устанавливаете для пользователя или машины?Вы админ?Где обычно находится DLL?

Редактировать : Попробуйте использовать Process Monitor для отслеживания того, к какому файлу действительно осуществляется доступ.

1 голос
/ 20 апреля 2011

Решение оказалось довольно простым: одну из неуправляемых библиотек DLL нужно было перекомпилировать для x64.

Ключевые шаги:

  • Проверьте монитор процесса на наличие вероятных источников ошибок. Внимательно посмотрите на сообщение об ошибке, которое Windows предлагает отправить в случае сбоя приложения.
  • Включите файлы .pdb для управляемых библиотек. Это привело к более информативным сообщениям об ошибках.
  • Эти сообщения об ошибках не только указывали, какая управляемая библиотека вызывала ошибку, но и указывали, что это проблема x86 / x64. (BadImageFormatException)
  • Следуя некоторым здравым советам, убедитесь, что все из неуправляемых библиотек ориентированы на x86. (Мои были, но это хорошо, чтобы быть уверенным.)
  • Перекомпилируйте неуправляемые зависимости проблемной управляемой библиотеки на компьютере x64.
  • Напишите сценарий установки, который копирует соответствующую (x86 или x64) версию DLL.
  • Profit!

Особенности:

  • Проблема, с которой я, похоже, столкнулся с Audiere.Net.dll, но на самом деле была вызвана проблемой с libaudieresharpglue.dll.
  • Я использую NSIS для установщиков. Для реализации специфичной для архитектуры DLL я использовал заголовок x64.nsh .
1 голос
/ 20 апреля 2011

Вы упоминаете, что Audiere.Net.dll предназначен для x86, но как насчет вашего исполняемого файла?

Очевидно, что вы можете перекомпилировать вашу программу или использовать Corflags (часть фреймворка) для просмотра текущих настроек вашего exe.

 Corflags ssd2.exe

Или установить или снять флаг

 Corflags ssd2.exe /32BIT+ 

 Corflags ssd2.exe /32BIT-

(Обратите внимание, что если ваше приложение подписано строгим именем, оно не будет работать, если вы не используете / Force для удаления подписи)

1 голос
/ 14 апреля 2011

Если вы работаете с приложением .Net, установлен ли на обоих компьютерах установленный Framework?

0 голосов
/ 20 апреля 2011

Я помню, сталкивался с подобной проблемой с оболочкой SQLite.Источником проблемы, конечно же, является проблема 32/64 бита, и это тот же сценарий, что оболочка SQLite является управляемой оболочкой, что делает ее зависимой от процессора.

Я предполагаю, что пока вы управляете lib(Audiere.Net.dll) скомпилирован для 32 бит, ваше основное приложение (ssd2.exe) имеет значение , а не .

Папка установки определяется конфигурацией установки, но если проект приложения не сконфигурирован строго для компиляции как проект x86 (обычно нацеленный на стандартную Любую среду процессора ), тогдаПриложение будет запущено как 64-битный процесс, независимо от пути установки.В этом легко убедиться, посмотрев процесс в диспетчере задач на 64-битной машине, все 32-битные процессы имеют дополнительные * 32 на 64-битной машине с Windows (на 32-битной машине их не будет).

РЕДАКТИРОВАТЬ: или проще, посмотрев в свойствах проекта-> Build-> Platform Target:)

В любом случае - вам нужно изменить настройки проекта для проекта, который собирает ssd2.exe, на целевой x86 иты должен быть в порядке.

0 голосов
/ 19 апреля 2011

Мы столкнулись с чем-то похожим и обнаружили, что нам нужно загрузить c ++ Redistibuatable Package , чтобы запустить программу на Windows 7 с использованием сторонних библиотек.

0 голосов
/ 14 апреля 2011

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

...