Мне нужна моя программа, чтобы определить, была ли она скомпилирована для 32-битных окон или 64-битного/любого процессора. Мне нужно выбрать другой флаг сервера COM в зависимости от параметров компиляции. Есть идеи?Как определить, была ли скомпилирована исполняемая программа для 64 бит?
ответ
Проверка во время выполнения, если вы работаете в 64-битное приложение:
Чтобы увидеть ли ваш процесс 64-битной или 32-бит, вы можете просто проверить IntPtr.Size или любой другой тип указателя. Если вы получаете 4, то вы работаете на 32-битном. Если вы получаете 8, вы работаете на 64-битной основе.
Какой тип компьютера ваш процесс работает следующим образом:
Вы можете проверить переменную PROCESSOR_ARCHITECTURE среды, чтобы увидеть, если вы работаете на x64, ia64 или x86 машине.
Является ли ваш процесс работает в режиме эмуляции:
Интерфейс Win32 API IsWow64Process сообщит вам, если вы работаете в 32-разрядное приложение под x64. Wow64 означает Windows32 на windows64.
Вопреки тому, что опубликовали другие люди: IsWow64Process не скажет вам, используете ли вы 32-разрядное или 64-битное приложение. На 32-битных машинах он скажет вам FALSE для 32-разрядных приложений при запуске, а на 64-битной машине он скажет вам TRUE для 32-битного приложения. Он сообщает только, работает ли ваше приложение под эмуляцией.
Привет, Брайан, _WIN64, похоже, не определен в vs2008. Есть идеи? – Steve
Я обновил свой ответ, извините, сначала я думал, что вы сказали C++. Я обновил его с помощью информации на C#. –
Требуется приложение командной строки CORFLAGS от Microsoft. http://msdn.microsoft.com/en-us/library/ms164699(VS.80).aspx
Вы можете сделать это на основе установки констант времени компиляции и выполнения #ifs на основе этих параметров, чтобы установить значение, которое вы можете проверить, чтобы посмотреть, на какой платформе было скомпилировано приложение. См. Target platform/processor at compile time.
Самый простой способ - проверить свойство IntPtr.Size, чтобы увидеть, является ли это 4 (32 бит) или 8 (64 бит).
Посмотрите на conditional methods.
Вы можете использовать функцию IsWow64Process для определения во время выполнения, если ваш COM-сервер является процессом x64 или win32.
Если вы просто хотите знать это во время компиляции: компилятор устанавливает макрос _WIN64.
Из документов: «Если приложение представляет собой 64-разрядное приложение, работающее под 64-разрядной Windows, параметр Wow64Process установлен в FALSE.» ... как это помогает? –
IsWow64Process не скажет вам, используете ли вы 32-разрядное или 64-битное приложение. На 32-битных машинах он скажет вам FALSE при запуске, а на 64-битной машине он скажет вам TRUE для 32-битного приложения. –
Хммм, _WIN64, по-видимому, не работает. Код неактивен, хотя я компилирую его в 64-разрядном – Steve
Хотя кажется странным маршрутом, вы можете узнать, работаете ли вы в 32-разрядном (или 64-битном в WOW64) или 64-битном .NET-коде, проверяя IntPtr.Size.
На 32-бит/WOW64, IntPtr.Size равно 4.
На 64-бит, IntPtr.Size равно 8.
Источник: Migrating 32-bit Managed Code to 64-bit Managed Code на MSDN.
использование GetBinaryType функции API, и вы будете иметь тип файла
это ссылка на API на MSDN http://msdn.microsoft.com/en-us/library/aa364819(VS.85).aspx
результаты:
SCS_32BIT_BINARY = 32 бит ехе
SCS_64BIT_BINARY = 64 бит EXE
SCS_DOS_BINARY = DOS
SCS_OS216_BINARY = OS 2
SCS_WOW_BINARY = 16 бит
SCS_POSIX_BINARY = POSIX на основе
SCS_PIF_BINARY = PIF файл /, которые выполняют на DOS
Вы можете использовать предопределенные макросы, чтобы проверить тип компиляции
#if (_WIN64)
const bool IS_64 = true;
#else
const bool IS_64 = false;
#endif
Вы знаете, Environment.Is64BitProcess
? Определяет, является ли текущий текущий процесс 64-битным процессом.
Спасибо! Я думаю, что это решение должно быть отмечено как правильно. –
Вы больше обеспокоены тем, работает ли он в настоящее время как 32-разрядное или 64-битное приложение? –