Переход с AnyCPU на x86 вызывает ошибку System.BadImageFormatException - PullRequest
3 голосов
/ 15 апреля 2019

Я создал WinForms UserControl.

Когда я покидаю платформу в AnyCPU, я могу без проблем отлаживать ее: когда я нажимаю Play, появляется предварительный просмотр.

Затем япопробуйте изменить проект на x86.Поэтому я нажимаю «AnyCPU», затем «Диспетчер конфигурации».

В «Активной платформе проекта» я выбираю «New ...».

Теперь я выбираю «x86» и нажимаю «Ok ".

Затем, когда я нажимаю" Play ", я получаю ошибку" System.BadImageFormatException ".

Это общая проблема или что-то очень, очень неправильное в моей системе?

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

enter image description here

enter image description here

enter image description here

Ответы [ 2 ]

2 голосов
/ 23 апреля 2019

Я могу воспроизвести ошибку, обнаруженную в VS 2017 15.9.8, просто:

  • Создать новую (VB или C #) библиотеку управления Windows Forms
  • Проверьте, что она запускается по умолчаниюПлатформа решений AnyCpu
  • Создание новой платформы решений x86
  • Попробуйте запустить проект

При отладке WindowsFormsControlLibrary в Visual Studio ваша DLL загружается через узел отладки«UserControlTestContainer.exe», созданный для «AnyCpu (предпочтительно 64 бита)».

Подробную информацию об этом можно получить, щелкнув правой кнопкой мыши на панели задач запущенного хоста отладки, щелкнув правой кнопкой мыши по его значку, выберите Свойства , чтобы найти его путь и передать, например, ILSpy.

Так что я думаю, что когда отладочный хост работает как 64-битный, и передается 32-битная DLL для загрузки, несоответствие по битности приводит к сбою Assembly.LoadFrom .

[Edit]

Это похоже на ошибку, так как она предотвращает (легко) отладку библиотеки управления WinFormsкоторый имеет зависимость (например, неуправляемый сода) это только x86.

Но я сомневаюсь, что проблемы отладки WinForms только для x86 - это то, что команда VS расставит по приоритетам.

В качестве обходного пути вы можете написать свой собственный тестовый контейнер (!)или:

  • Запустите командную строку VS как admin
  • Создайте копию UserControlTestContainer.exe
  • Используйте corflags /32bitreq+ /32bitpref+ <PathToExe>, чтобы установитьКопировать для запуска в качестве x86
  • Установить копию в качестве цели «Запуск внешней программы» в параметрах отладки
  • Установить путь к вашей dll в качестве аргумента командной строки отладки
0 голосов
/ 15 апреля 2019

Это распространенная проблема, которая обычно означает, что вы пытаетесь вызвать 64-битную библиотеку из 32-битного исполняемого файла.Убедитесь, что вы используете 32-битные библиотеки при компиляции для x86.

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