IntPtr.Size не поверне правильне значення, якщо він працює в 32-розрядному .NET Framework 2.0 для 64-розрядних Windows (він поверне 32-бітний).
Як описує Реймонд Чен від Microsoft, спочатку ви повинні перевірити, чи працює він у 64-бітному процесі (я думаю, що в .NET ви можете це зробити, перевіривши IntPtr.Size), і якщо ви працюєте в 32-бітному процесі, ви все одно доведеться викликати функцію Win API IsWow64Process. Якщо це повертає справжнє значення, ви працюєте в 32-бітному процесі в 64-розрядної Windows.
Реймон Чен від Майкрософт:
Як програмно визначити, чи працюєте ви на 64-бітних Windows
Моє рішення:
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;
}
}