Мое приложение .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 генерировать правильную процессорную архитектуру в манифесте при развертывании.
Может кто-нибудь помочь, пожалуйста?