2009-03-11 2 views
6

Мне нужна моя программа, чтобы определить, была ли она скомпилирована для 32-битных окон или 64-битного/любого процессора. Мне нужно выбрать другой флаг сервера COM в зависимости от параметров компиляции. Есть идеи?Как определить, была ли скомпилирована исполняемая программа для 64 бит?

+0

Вы больше обеспокоены тем, работает ли он в настоящее время как 32-разрядное или 64-битное приложение? –

ответ

7

Проверка во время выполнения, если вы работаете в 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-битного приложения. Он сообщает только, работает ли ваше приложение под эмуляцией.

+0

Привет, Брайан, _WIN64, похоже, не определен в vs2008. Есть идеи? – Steve

+0

Я обновил свой ответ, извините, сначала я думал, что вы сказали C++. Я обновил его с помощью информации на C#. –

2

Требуется приложение командной строки CORFLAGS от Microsoft. http://msdn.microsoft.com/en-us/library/ms164699(VS.80).aspx

+0

Как инструмент командной строки corflags поможет определить сборку для 32 бит/64 бит или * MSIL *? – Elangesh

+0

Я нашел ответ. http://stackoverflow.com/questions/270531/how-to-determine-if-a-net-assembly-was-built-for-x86-or-x64. Спасибо за ваш вклад @Walden Leverich – Elangesh

1

Вы можете сделать это на основе установки констант времени компиляции и выполнения #ifs на основе этих параметров, чтобы установить значение, которое вы можете проверить, чтобы посмотреть, на какой платформе было скомпилировано приложение. См. Target platform/processor at compile time.

Самый простой способ - проверить свойство IntPtr.Size, чтобы увидеть, является ли это 4 (32 бит) или 8 (64 бит).

2

Вы можете использовать функцию IsWow64Process для определения во время выполнения, если ваш COM-сервер является процессом x64 или win32.

Если вы просто хотите знать это во время компиляции: компилятор устанавливает макрос _WIN64.

+0

Из документов: «Если приложение представляет собой 64-разрядное приложение, работающее под 64-разрядной Windows, параметр Wow64Process установлен в FALSE.» ... как это помогает? –

+0

IsWow64Process не скажет вам, используете ли вы 32-разрядное или 64-битное приложение. На 32-битных машинах он скажет вам FALSE при запуске, а на 64-битной машине он скажет вам TRUE для 32-битного приложения. –

+0

Хммм, _WIN64, по-видимому, не работает. Код неактивен, хотя я компилирую его в 64-разрядном – Steve

1

Хотя кажется странным маршрутом, вы можете узнать, работаете ли вы в 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.

2

использование 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

0

Вы можете использовать предопределенные макросы, чтобы проверить тип компиляции

#if (_WIN64) 
     const bool IS_64 = true; 
    #else 
     const bool IS_64 = false; 
    #endif 
3

Вы знаете, Environment.Is64BitProcess? Определяет, является ли текущий текущий процесс 64-битным процессом.

+0

Спасибо! Я думаю, что это решение должно быть отмечено как правильно. –

 Смежные вопросы

  • Нет связанных вопросов^_^