Google дал мне понять, что это возможно скомпилировать код в один исполняемый файл, который будет работать как 32-разрядная на 32-разрядной ОС и в качестве 64-разрядная на 64-разрядной ОС. Реально ли для исполняемого файла определить его разрядность во время выполнения?
В моем случае целевые системы были бы Windows 7 Professional x64
а также Windows XP SP3 x86
,
Итак, что я читаю в различных статьях (я думаю, что были даже ответы на похожие темы по SO), так это то, что нужно идти к Soltuion
«s Configuration Manager
(Юаней на решение -> Менеджер конфигурации) и установите Platform
в Любой процессор.
Теперь во всех этих статьях описана установка для более старых версий MSVS или MSVC ++, но я думаю, что в Configuration Manager
в версии RC 2013 года (которую я только недавно установил).
в Active Solution
выпадающий у меня нет возможности Any CPU
вот я и пошёл этот рецепт что я нашел на ТАК. Следуя этому небольшому руководству не удается в моем случае, у меня все еще нет возможности выбрать Any CPU
при выполнении шага 5:
Доступные мне выпадающие элементы: x64
а также ARM
(Win32
тоже, но это уже добавлено по умолчанию), я не могу выбрал Any CPU
,
Добавление целевой платформы x64
и компиляция исполняемого файла работает нормально, программа работает как 64-битная на Windows 7 x64, но, конечно, она не может быть запущена на 32-битной машине с Windows XP.
Как мне установить целевую платформу на Any CPU
в Microsoft Visual Studio Professional 2013 RC?
Нет, это абсолютно не так. Вам нужно определить отдельные исполняемые файлы.
Раскрывающийся список «Любой ЦП» позволяет установить параметры компилятора для нескольких платформ (например, процессор _DEBUG для x64 и Win32). На самом деле вы не можете выполнить сборку для этой цели.
AnyCPU относится к программам .Net, а не к C ++. C ++ должен компилироваться до нативного, x86 или x64. Вы можете собрать 64-битную программу и встроить ее в 32-программу, извлекая ее во время выполнения. Эта техника используется ProcessExplorer.
Возможно, это не верный ответ, но для большинства вещей запуск 32-битного кода в 64-битной системе работает абсолютно нормально. Конечно, он может работать немного медленнее, но по сравнению с необходимостью иметь дело (и тщательно тестировать) два разных двоичных файла, если только это не приводит к значительным преимуществам в производительности в 64-битном режиме (или если ваше приложение использует более 2 ГБ пространства памяти), Я бы очень хотел использовать 32-битный режим.
MacOS поддерживает так называемые «толстые двоичные файлы», где программа компилируется дважды, и обе версии упаковываются в один файл. ОС решает, какую версию запустить.
Windows не имеет ничего подобного.
Вы можете скомпилировать оболочку .NET (Любой ЦП) и остальную часть программы как yourprogram86.dll и yourprogram64.dll.
[DllImport("yourprogram32.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "open")]
public static extern void open32();
[DllImport("yourprogram64.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "open")]
public static extern void open64();
static bool Is64()
{
//.Net 4.0
//Environment.Is64BitOperatingSystem
//.Net 2.0
return IntPtr.Size == 8;
}
static void open()
{
if (Is64())
open64();
else
open32();
}