НажмитеOnce:BadImageFormatException при запуске пакета x86 в 64-битных Windows

StackOverflow https://stackoverflow.com/questions/1631483

Вопрос

Мое приложение .NET 2.0 импортирует неуправляемую 32-битную dll.DLL загружается (происходит первый вызов взаимодействия), когда пользователь открывает файл через диалоговое окно в приложении.

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

Я повторно развернул приложение, используя x86 в качестве целевой платформы.Я так понимаю это должно решить проблему битности.

НО

Когда я запускаю развернут приложения, созданного для x86 в 64-битной системе, теперь я получаю исключение BadImageFormatException непосредственно перед запуском приложения.Протестировано как минимум на трех 64-битных машинах.На 32-битных машинах работает без проблем.

Когда я запускаю приложение напрямую из VS (или не напрямую, просто обычная сборка, не использующая ClickOnce), в 64-битных окнах при использовании целевой платформы x86 проблем нет.Приложение запускается, и пользователь может загрузить файл — вызов взаимодействия завершается успешно.

Я отлаживал это уже 2 дня подряд, но безрезультатно - пробовал на разных компьютерах.Кажется, он стабильно работает на одном из компьютеров, которые я пробовал.Однако у меня нет постоянного доступа к этому компьютеру.

Однажды мне удалось создать развертывание ClickOnce на своем компьютере, и оно работало на 64-битной машине.Это была единственная попытка из 100!Ничего не изменилось, единственное изменение заключалось в том, что я выполнил успешную сборку сразу после перезагрузки компьютера.

Я МНОГО раз очищал/перестраивал/перезагружал VS/перезагружал Windows.Я переустановил VS 2008, а теперь и всю ОС, не помогло.


РЕДАКТИРОВАТЬ:Мне только что удалось получить одну хорошую сборку (из следующих 100 :)) и провести сравнение развернутых каталогов.Источник проблемы заключается в том, что ClickOnce генерирует неправильную целевую платформу в манифесте основного .exe:

<asmv1:assemblyIdentity name="app.exe" version="1.0.4.18" publicKeyToken=".token here." language="neutral" processorArchitecture="<b>msil</b>" type="win32" />

Архитектура процессора должна быть x86.

Итак, вопрос в том, как последовательно заставить VS генерировать правильную архитектуру процессора в манифесте при развертывании.

Кто-нибудь может помочь, пожалуйста?

Это было полезно?

Решение

Проблема была решена путем установки VS 2008 SP1 на 64-разрядную версию Windows 7.VS2008 SP1 на XP имела проблему на двух машинах, с которыми я пробовал.

Другие советы

У меня тоже была эта проблема при использовании VS2008 SP1.В моем случае у меня была 32-битная DLL, которую нужно было скомпилировать как 32-битную, и приложение, использующее ее в том же решении.Несмотря на то, что я указал X86 в качестве цели для сборки выпуска, когда я опубликовал 64-битное приложение, оно было скомпилировано и включено в установщик.Я нашел немного брутальное решение проблемы:Зайдите в диспетчер конфигурации и удалите все возможные конфигурации, кроме той, которую вы хотите собрать (версии отладки и выпуска).После этого я обнаружил, что установщик clickonce был создан с правильным приложением.

Надеюсь, это поможет кому-то еще, я время от времени боролся с этой проблемой в течение нескольких месяцев.

Я бы предложил использовать Отражатель чтобы открыть основной exe-файл, развернутый ClickOnce, и просмотреть зависимости, чтобы убедиться, что вы не развертываете 64-разрядную версию dll по ошибке.

Вы должны разрешить запуск 32-разрядных приложений в IIS 7.Видеть http://www.fishofprey.com/2009/04/badimageformatexception-in-iis-70-on-64.html

Иногда кажется, что процесс публикации ClickOnce кэширует старые файлы из предыдущих сборок Any CPU или x64.Выполнение «Очистить и перестроить все» не решило эту проблему для меня.Мне нужно было удалить все папки bin и obj из моих проектов и снова открыть Visual Studio.

Мы столкнулись с этой проблемой и определили, что подкаталог профиля пользователя, в котором ClickOnce развернул наше приложение, вероятно, был поврежден, поскольку мы смогли успешно развернуть приложение с помощью ClickOnce, войдя в систему как другой пользователь на том же компьютере.

Мы смогли решить проблему, просто удалив подкаталог C:\Users\<user>\AppData\Local\Apps под которым ClickOnce развертывал наше приложение.В нашем случае это было C:\Users\<user>\AppData\Local\Apps\2.0.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top