ClickOnce: BadImageFormatException при запуске пакета x86 в 64-битных окнах - PullRequest
5 голосов
/ 27 октября 2009

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

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

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

НО

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

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

Я отлаживал это 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 генерировать правильную процессорную архитектуру в манифесте при развертывании.

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

Ответы [ 6 ]

3 голосов
/ 28 октября 2009

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

1 голос
/ 04 мая 2011

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

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

0 голосов
/ 18 октября 2016

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

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

0 голосов
/ 12 февраля 2013

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

0 голосов
/ 17 октября 2012

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

0 голосов
/ 27 октября 2009

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

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