Да, IsWow64Process досадно бесполезен. Это на самом деле означает «включена 32-битная эмуляция» и возвращает false, если вы работаете в 32-битной операционной системе, эмуляция не требуется.
Вы сможете извлечь из этого выгоду только в том случае, если вы точно знаете, что работаете в 64-битной операционной системе. Что сложно выяснить. IntPtr.Size == 8 проверяет, что вы запускаете 64-разрядную версию, но не доказывает, что она определенно не является 64-разрядной операционной системой. 64-разрядная версия платформы, возможно, не была установлена. Или ваш код может быть запущен из .exe, для которого Platform Target принудительно установлен x86. Что не необычно для кода, который заинтересован в битности.
Вам потребуется P / Invoke GetNativeSystemInfo (). Если это выбрасывает (или GetProcAddress возвращает IntPtr.Zero), вы точно знаете, что это 32-разрядная операционная система. Если это не так, проверьте значение SYSTEM_INFO.wProcessorArchitecture. Это будет 9 для x64, 6 для Titanium, 0 для x86. Так что, если вы получите 9, то используйте IsWow64Process. Посетите pinvoke.net для объявлений.
Обратите внимание, что новая .NET 4.0 Environment.Is64BitOperatingSystem имеет тот же недостаток.