Родная x64 dll не работает - PullRequest
       1

Родная x64 dll не работает

2 голосов
/ 26 февраля 2012

У меня есть приложение, которое я компилирую как код x86, но как отдельную версию, а также код x64. Приложение в основном состоит из двух частей: исполняемого файла c # и неуправляемой dll c ++. У меня проблемы с последним. На моем компьютере для разработки (Windows 7 64-bit, Visual Studio 2008) я создаю установку с проектом развертывания, и эта установка устанавливает приложение в Program Files ... как должно, и приложение запускается. У меня также есть тестовый ПК (64-битная Windows 7, практически ничего другого). Там приложение все еще устанавливается в Program Files ... но оно не запускается, я получаю исключение BadImageFormatException при вызове функции (любой функции) неуправляемой библиотеки DLL. Проблема в том, что мой собственный проект, который производит dll, также использует довольно много свободно доступных библиотек (например, glew32, openal, freeimage и т. Д.). Я позаботился о том, чтобы убедиться, что я использую x64-версии этих библиотеки, но что-то все равно должно быть не так. По какой-то причине одна из библиотек, используемых моей DLL, не доступна в виде кода x64 на тестовом ПК, но она находится на ПК для разработки. По крайней мере, это единственное объяснение, которое у меня есть на данный момент, почему моя установка работает на ПК для разработки, но не на тестовом ПК. Мой вопрос: как я могу узнать, где проблема. Сообщение об ошибке, которое я получаю, не сообщает никаких полезных подробностей. Я пытался проанализировать мою DLL с зависит, но это выглядит нормально. В нем много зависимых библиотек, таких как X86 (это, вероятно, системные файлы), но все те, которые я использую специально, перечислены как x64. Есть ли способ проверить, почему Windows на моем тестовом компьютере пытается запустить DLL как код x86, даже если это x64? Спасибо.

Я заметил кое-что очень странное: мое приложение разворачивается в папке Program Files, как и должно быть для приложения x64, но оно не запускается. Однако, если я скопирую все файлы в папке, в которую он установлен, в другую папку (внутри папки «Документы»), приложение будет работать отлично.

Ответы [ 3 ]

0 голосов
/ 26 февраля 2012

Вы создали свой исполняемый файл .NET (или DLL) с конфигурацией Any CPU, и вы предоставили собственную x64 / Win32 DLL для Win32 / x64 (т.е. неправильная конфигурация).

  • В системах x64 ваш двоичный файл .NET попытается загрузить собственную DLL, как если бы собственная DLL была x64.
  • И на 32-битных системах он попытается загрузить 32-битную собственную DLL.
0 голосов
/ 24 апреля 2012

Я нашел ответ.Проблема была вовсе не в 64-битной dll.Одна из библиотек, которые я не создал, но я ссылаюсь на (я пока не знаю, какая именно), пытается записать файл в папку приложения.Конечно, это не разрешено в папке Program Files, если вы не запускаете приложение от имени администратора.Извините за просьбу о помощи по неправильному вопросу.

0 голосов
/ 26 февраля 2012

Запустите Fusion Log Viewer на машине, где вы хотите диагностировать проблему. Посмотрите внимательно на логи, и вы увидите, какие именно библиотеки загружаются и откуда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...