PInvoke c ++ dll из c # - была предпринята попытка загрузить программу с неверным форматом.(Исключение из HRESULT: 0x8007000B) - PullRequest
3 голосов
/ 28 апреля 2011

Попытка получить доступ к старой c ++ dll из c # с помощью Dll Import. Искал около 4 дней в сети безуспешно.

Я пытаюсь использовать c ++ dll с веб-сайта asp.net mvc 3 .net 4.

Я изменил цель платформы на x86. Я установил «Включить 32-битное приложение» в true для пула приложений в iis.

Использование Windows Server 2008 R2 с iis 7.5

Есть ли способ отладить это или получить больше информации о том, что может быть не так?

Ссылка ASP.NET P / Invoke «Предпринята попытка загрузить программу с неверным форматом» гласит:

«Чтобы использовать 32-битную DLL, ваше веб-приложение должно работать в 32-битном режиме, что выполняется путем переключения IIS для запуска в 32-битном режиме» и дает ссылку о том, как вы можете это изменить, однако это кажется относиться к IIS 6 и asp.net 2

Заранее спасибо! С наилучшими пожеланиями

Редактировать 1: Не приведет ли ошибочное объявление вызовов метода c ++ в c # к этой ошибке? Читая ошибку, можно предположить, что вызов функции с 3 параметрами, которые должны получить 4, приведет к этой ошибке.

1 Ответ

3 голосов
/ 28 апреля 2011

Хорошо, чтобы ответить на ваш последний вопрос:

Может ли ошибочное объявление вызовов метода C ++ в c # привести к этой ошибке?

Нет, я не верю, что это может привести к ошибочному объявлению метода C ++, что может привести к ряду причин - от корректно выполняющейся функции до генерируемого исключения взаимодействия, однако я не верю, что это исключение будет брошено - это специфично для проблемы загрузки DLL.

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

Вам также следует убедиться, что dll, который вы пытаетесь загрузить (и все его зависимости), на самом деле 32-битный - я полагаю, что у вас возникнет аналогичная проблема, если вы попытаетесь загрузить 64-битный dll в 32-битный процесс. Вы должны иметь возможность использовать Dependency Walker (универсальный очень полезный инструмент), чтобы проверить это.

...