IntPtr.Size não retornará o valor correto se estiver executando no .NET Framework 2.0 de 32 bits no Windows de 64 bits (retornaria 32 bits).
Como descreve Raymond Chen, da Microsoft, você deve primeiro verificar se está executando um processo de 64 bits (acho que no .NET você pode fazer isso verificando IntPtr.Size) e, se estiver executando um processo de 32 bits, ainda assim precisa chamar a função API do Windows, IsWow64Process. Se isso retornar verdadeiro, você estará executando um processo de 32 bits no Windows de 64 bits.
Raymond Chen, da Microsoft:
Como detectar programaticamente se você está executando no Windows de 64 bits
Minha solução:
static bool is64BitProcess = (IntPtr.Size == 8);
static bool is64BitOperatingSystem = is64BitProcess || InternalCheckIsWow64();
[DllImport("kernel32.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool IsWow64Process(
[In] IntPtr hProcess,
[Out] out bool wow64Process
);
public static bool InternalCheckIsWow64()
{
if ((Environment.OSVersion.Version.Major == 5 && Environment.OSVersion.Version.Minor >= 1) ||
Environment.OSVersion.Version.Major >= 6)
{
using (Process p = Process.GetCurrentProcess())
{
bool retVal;
if (!IsWow64Process(p.Handle, out retVal))
{
return false;
}
return retVal;
}
}
else
{
return false;
}
}