1. ホーム
  2. c#

[解決済み】.NETでWindowsの64ビットプラットフォームを検出する方法は?

2022-03-31 06:34:20

質問

での .NET 2.0 C#アプリケーションでは、次のコードを使ってオペレーティング・システム・プラットフォームを検出しています。

string os_platform = System.Environment.OSVersion.Platform.ToString();

これは、"Win32NT"を返します。問題は、Windows Vista 64bitで実行しても"Win32NT"が返されることです。

正しいプラットフォーム(32ビットか64ビットか)を知るための他の方法はないのでしょうか?

なお、Windows 64bit上で32bitアプリケーションとして実行した場合にも64bitを検出するはずです。

解決方法は?

UPDATEしてください。 Joel Coehoornなどが提案しているように、.NET Framework 4.0から、単に Environment.Is64BitOperatingSystem .


64ビットWindows上の32ビット.NET Framework 2.0で実行すると、IntPtr.Sizeは正しい値を返しません(32ビットを返すでしょう)。

MicrosoftのRaymond Chenが説明しているように、まず64ビットプロセスで動作しているかどうかを確認し(.NETではIntPtr.Sizeを確認することで可能だと思います)、32ビットプロセスで動作している場合は、やはりWin API関数IsWow64Processを呼び出さなければなりません。これがtrueを返した場合、64ビットWindows上の32ビットプロセスで実行されていることになります。

マイクロソフトのレイモンド・チェン氏 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;
    }
}