Есть ли инструмент, который объединит 32-битное + 64-битное приложение и упакует их вместе в одно 32 + 64-битное приложение?

На сервере Windows 2008 R2 (установка ядра сервера) wow64 больше не является обязательным компонентом.

Я могу скомпилировать 32-битное приложение, используя тот же исходный код, что и 64-битное приложение (с несколькими ifdef тут и там).

Есть ли инструмент, который помещает обе версии моего приложения в один исполняемый файл, чтобы мое 32+64-разрядное приложение работало в чистой 32-разрядной Windows и только в 64-разрядной Windows?

Обратите внимание, что я не говорю об упаковщике, потому что сам упаковщик будет либо 32-битным, либо 64-битным.


person Johan    schedule 07.10.2011    source источник
comment
Вы можете написать загрузчик на языке .NET. Он поддерживает AnyCPU в качестве целевой платформы. Используйте IntPtr.Size, чтобы узнать, какая разрядность у вас есть.   -  person Hans Passant    schedule 08.10.2011
comment
@hans уверен, что AnyCPU полагается на WOW64   -  person David Heffernan    schedule 08.10.2011
comment
@David - нет, только если целевая платформа принудительно установлена ​​​​на x86.   -  person Hans Passant    schedule 08.10.2011
comment
Приложение Winzip/самораспаковка/32-битная установка запускает 32-битную или 64-битную программу установки в зависимости от версии ОС.   -  person Sheng Jiang 蒋晟    schedule 08.10.2011
comment
@sheng извините, это именно то, чего я хочу избежать   -  person Johan    schedule 08.10.2011
comment
Должен ли ваш код работать в версиях Windows до Windows 2008 R2/Windows 7?   -  person Harry Johnston    schedule 08.10.2011
comment
@Hans И загрузчик системы знает об этой уловке и делает все остальное. Похоже, это ответ.   -  person David Heffernan    schedule 08.10.2011
comment
Windows не поддерживает толстые приложения, поэтому без какого-то загрузчика это сделать невозможно. Вам нужно, чтобы загрузчик был одним файлом или это может быть каталог с файлом запуска?   -  person Harry Johnston    schedule 08.10.2011
comment
@Hans, .NET тоже не обязательно будет доступен. В 2008 R2 это нормально, потому что по крайней мере часть .NET всегда будет присутствовать, но это не будет работать в 2008.   -  person Harry Johnston    schedule 08.10.2011
comment
@HarryJohnston, да, приложение должно работать как минимум на Windows XP.   -  person Johan    schedule 08.10.2011


Ответы (1)


Нет. Заголовок EXE-файла отмечен архитектурой процессора, поддерживаемой кодом, содержащимся в EXE-файле. Используйте DUMPBIN.EXE -HEADERS для изучения.

EXE сообщает тип "машины" как: x86: 0x14C x64: 0x8664 ARM: 0x1C4

Если вы хотите развернуть свое приложение, создайте версию для x86, версию для x64 (ARM появится позже с Win8) и создайте пакет установки (MSI), который может динамически проверять архитектуру машины, на которую вы устанавливаете приложение. и закройте одно или оба приложения. Вот как, например, Adobe теперь распространяет Flash x86 и Flash x64 в последней загрузке Flash player.

Если вы хотите создать действительно универсальный двоичный файл, создайте его в .NET и отметьте его как целевой «любой» процессор. Затем ваше приложение будет объединено с архитектурой вашего компьютера (или с процессом хостинга в случае компонента надстройки).

person Rich Turner    schedule 07.10.2011
comment
Конечно, это БЫЛО возможно в прошлый раз... формат PE включает поле для 16-битной точки входа в DOS-режим... которая по умолчанию была заполнена заглушкой, которая напечатала Это приложение не может быть запущено в режиме DOS. но его можно заменить 16-битной версией приложения. Жаль, что они не сделали этого снова. - person Ben Voigt; 08.10.2011
comment
К сожалению, .NET также недоступен повсеместно, по крайней мере, до Windows 7/2008R2. - person Harry Johnston; 08.10.2011
comment
@Ben Voigt: На самом деле это было возможно только два раунда назад (двоичный файл DOS + Win16). Вы не можете упаковать двоичный файл Win16+Win32 или двоичный файл Win32+Win64. - person Raymond Chen; 08.10.2011
comment
В принципе, я считаю, что можно написать пакет установщика Windows (файл MSI), который распаковывает и запускает соответствующую версию вашего приложения, а не устанавливает его. Я думаю, что вы максимально приблизитесь к универсальному двоичному файлу, который будет работать на всех системах XP+. Однако вам нужно будет работать в рамках спецификации Windows Installer 2.0, потому что это может быть все, что у вас есть. - person Harry Johnston; 09.10.2011