НажмитеOnce:BadImageFormatException при запуске пакета x86 в 64-битных Windows
-
06-07-2019 - |
Вопрос
Мое приложение .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
.