Visual Studio 2008 Express C ++ 32-битная сборка на 64-битной Windows 7 - PullRequest
2 голосов
/ 08 апреля 2011

Я использую Visual Studio 2008 Express.У меня есть решение, которое раньше нормально работало на Vista 32 бит.Я недавно перешел на Windows 7, и часть из него перестала работать.Это мои настройки: - Неуправляемая статическая библиотека C ++, «библиотека» - Управляемая DLL C ++, которая включает функциональность «библиотеки» для использования в C #, «DLL» - Управляемое консольное приложение C ++, которое ссылается на «DLL» - Приложение C #который ссылается на «DLL»

Я получаю исключение, которое выдается DLL при запуске приложения C #, и я обычно отлаживаю подобные проблемы через управляемое консольное приложение C ++, так как затем могу войти в неуправляемую библиотекуcode.

Проблема в том, что я теперь получаю всплывающее диалоговое окно с некоторыми странными символами и путем к "C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ dw20.exe" , а затем мое приложение перехватывает исключение «System.BadImageFormatException: не является допустимым приложением Win32» , возникающее при попытке запустить управляемое консольное приложение C ++.Я потратил много времени на изучение этой проблемы, и все, что хотя бы отдаленно напоминает полезный совет, относится к созданию проектов X86 в C #, но ничего о C ++.Я попытался добавить / MACHINE: X86 в библиотечные опции библиотеки, но, похоже, это не сработало.

Я думаю, вкратце, мой вопрос, как мне сделатьуверен, что моя неуправляемая статическая библиотека C ++ построена так, что она может работать на 32-битных системах?

Ответы [ 2 ]

4 голосов
/ 08 апреля 2011

Программа dw20.exe - это «Доктор Ватсон», программа, которая сообщает о необработанных исключениях и сбоях во время выполнения.Не источник проблемы, просто посланник.Хотя в этом вопросе и не указано, я должен предположить, что ваша версия Windows 7 является 64-битной, общий источник System.BadImageFormatException.

Исключение вызвано 64-битным процессом, пытающимся загрузить DLL, которая былапостроен для 32-битных.Или наоборот, 32-битный процесс не может загрузить 64-битную DLL.Интенсивность процесса определяется EXE, приложением C ++ / CLI в вашем случае.У него нет возможности изменить его с помощью простой настройки проекта, как в C # проектах.Вы делаете это путем добавления платформы: «x64» использует 64-битный компилятор и генерирует 64-битный исполняемый файл.Я почти уверен, что это не доступно в C ++ Express, хотя у вас нет 64-битных компиляторов, поэтому всегда нужно генерировать 32-битный исполняемый файл.

Что оставляет очень мало места для объясненияисключение.Это может пойти не так, как если бы вы изменили настройку цели Platform в своем проекте библиотеки классов C #.От x86 или AnyCPU до x64.Измените его обратно на AnyCPU.Проект + Свойства, вкладка "Сборка".Если вы сделали что-нибудь, чтобы обойти ограничения редакции Express, например, добавили 64-битные компиляторы из выпуска SDK, то это было бы основным красным флагом и для источника проблемы.

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

Измените встроенный любой процессор на 32 или 86, и у вас не должно возникнуть проблем.вы, вероятно, используете в коде c ++ Windows 32 DLL, поэтому он не работает на других платформах.Любой CPU-> диспетчер конфигурации затем меняется на 32 или 86

...