NETでWindows 64ビットプラットフォームを検出するにはどうすればよいですか?


269

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

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

これは「Win32NT」を返します。問題は、Windows Vista 64ビットで実行している場合でも「Win32NT」を返すことです。

正しいプラットフォーム(32または64ビット)を知る方法は他にありますか?

Windows 64ビットで32ビットアプリケーションとして実行した場合、64ビットも検出することに注意してください。

回答:


200

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ビットプロセスで実行しています。

Microsoftのレイモンドチェン: 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;
    }
}

7
32ビットOSで実行している場合、IsWow64Processを呼び出すと、kernel32.dllにそのエントリがないため、例外がスローされます。1code.codeplex.com/SourceControl/changeset/view/39074#842775でcodeplexから示されている解決策を確認する必要があります。このページの下部にリストされているそのコードに基づく解決策もあります。コードを再利用します。
dmihailescu

7
IsWow64Processは、Win XP SP2で導入されました。XP SP2以降のバージョンが必要な場合、このコードは正常に機能します。
Marc

3
@ dmihailescu、IsWow64Processを呼び出す前に、DoesWin32MethodExistを使用できます。これは、is64BitOperatingSystemの.net 4.0実装が行うことです。
11年

4
このソリューションは、Widows 7 Ultimateパーティションを使用してBootcampを実行しているIntel i7-3720QMマイクロプロセッサを搭載したMacBook Proで正しい値を返します。+1
マーククラム

11
参考:.Net 4.0以降では、確認するだけSystem.Environment.Is64BitOperatingSystemです。これをあなたの答えに編集できますか、それともあなたの答えに編集する許可を私に与えますか?
Joel Coehoorn 2013年

242

.NET 4の環境クラスには、Is64BitProcessIs64BitOperatingSystemという2つの新しいプロパティがあります。興味深いことに、Reflectorを使用すると、32ビット版と64ビット版のmscorlibでは実装が異なることがわかります。32ビットバージョンはIs64BitProcessに対してfalseを返し、Is64BitOperatingSystemに対してP / Invokeを介してIsWow64Processを呼び出します。64ビットバージョンは、両方に対してtrueを返します。


5
リフレクターの代わりに、なぜソースをダウンロードしないのか。次に、コメントやその他の「メモ」を取得します。
AMissico

3
参照ソースによると、これは次のようになります:(if (IntPtr.Size == 8) return true; if(!DoesWin32MethodExist(...,"IsWow64Process")) return false; return IsWow64Process(GetCurrentProcess());疑似コード)
多項式2012年

5
いいね。ユーザーが.NET 4.0を使用している場合、これは間違いなく正しい答えです(つまり、Environment.Is64BitOperatingSystem)。-FYIプロパティは.NET 3.5にはないようです。
BrainSlugs83 2013年

4
これは具体的に.Net 2.0と言っている質問には答えません
abbottdev

.NET CoreはMITライセンスでリリースされています。つまり、Is64BitProcessand Is64BitOperatingSystem(バージョン2.0のリンク)のソースコードを読むことができます。
クリスティアンCiupitu 2018


51

これは上記でBruno Lopezが提案したものの単なる実装ですが、Win2k +すべてのWinXPサービスパックで動作します。他の人が手で転がさないように、私が投稿すると思ったところです。(コメントとして投稿したはずですが、私は新しいユーザーです!)

[DllImport("kernel32", SetLastError = true, CallingConvention = CallingConvention.Winapi)]
public extern static IntPtr LoadLibrary(string libraryName);

[DllImport("kernel32", SetLastError = true, CallingConvention = CallingConvention.Winapi)]
public extern static IntPtr GetProcAddress(IntPtr hwnd, string procedureName);

private delegate bool IsWow64ProcessDelegate([In] IntPtr handle, [Out] out bool isWow64Process);

public static bool IsOS64Bit()
{
    if (IntPtr.Size == 8 || (IntPtr.Size == 4 && Is32BitProcessOn64BitProcessor()))
    {
        return true;
    }
    else
    {
        return false;
    }
}

private static IsWow64ProcessDelegate GetIsWow64ProcessDelegate()
{
  IntPtr handle = LoadLibrary("kernel32");

  if ( handle != IntPtr.Zero)
  {
    IntPtr fnPtr = GetProcAddress(handle, "IsWow64Process");

    if (fnPtr != IntPtr.Zero)
    {
      return (IsWow64ProcessDelegate)Marshal.GetDelegateForFunctionPointer((IntPtr)fnPtr, typeof(IsWow64ProcessDelegate));
    }
  }

  return null;
}

private static bool Is32BitProcessOn64BitProcessor()
{
  IsWow64ProcessDelegate fnDelegate = GetIsWow64ProcessDelegate();

  if (fnDelegate == null)
  {
    return false;
  }

  bool isWow64;
  bool retVal = fnDelegate.Invoke(Process.GetCurrentProcess().Handle, out isWow64);

  if (retVal == false)
  {
    return false;
  }

  return isWow64;
}

49

完全な答えはこれです(stefan-mg、ripper234、およびBobbyShaftoeの両方の回答から取得):

    [DllImport("kernel32.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi)]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool IsWow64Process([In] IntPtr hProcess, [Out] out bool lpSystemInfo);

    private bool Is64Bit()
    {
        if (IntPtr.Size == 8 || (IntPtr.Size == 4 && Is32BitProcessOn64BitProcessor()))
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    private bool Is32BitProcessOn64BitProcessor()
    {
        bool retVal;

        IsWow64Process(Process.GetCurrentProcess().Handle, out retVal);

        return retVal;
    } 

まず、64ビットプロセスであるかどうかを確認します。そうでない場合は、32ビットプロセスがWow64Processかどうかを確認してください。


13
これは、Win2000およびWinXP SP1以前では失敗します。IsWow64Process()関数はXP SP2およびVista / Win7でのみ導入されたため、呼び出す前に存在するかどうかを確認する必要があります。
user9876

2
@ user9876、まだそれらの旧式なシステムをターゲットにしている人はいますか?
CMircea

5
このサンプルは、Process.GetCurrentProcess()によって返されたProcessインスタンスを破棄できません。
Joe

42

マイクロソフトは、このためのコードサンプルを用意しました。

http://1code.codeplex.com/SourceControl/changeset/view/39074#842775

次のようになります。

    /// <summary>
    /// The function determines whether the current operating system is a 
    /// 64-bit operating system.
    /// </summary>
    /// <returns>
    /// The function returns true if the operating system is 64-bit; 
    /// otherwise, it returns false.
    /// </returns>
    public static bool Is64BitOperatingSystem()
    {
        if (IntPtr.Size == 8)  // 64-bit programs run only on Win64
        {
            return true;
        }
        else  // 32-bit programs run on both 32-bit and 64-bit Windows
        {
            // Detect whether the current process is a 32-bit process 
            // running on a 64-bit system.
            bool flag;
            return ((DoesWin32MethodExist("kernel32.dll", "IsWow64Process") &&
                IsWow64Process(GetCurrentProcess(), out flag)) && flag);
        }
    }

    /// <summary>
    /// The function determins whether a method exists in the export 
    /// table of a certain module.
    /// </summary>
    /// <param name="moduleName">The name of the module</param>
    /// <param name="methodName">The name of the method</param>
    /// <returns>
    /// The function returns true if the method specified by methodName 
    /// exists in the export table of the module specified by moduleName.
    /// </returns>
    static bool DoesWin32MethodExist(string moduleName, string methodName)
    {
        IntPtr moduleHandle = GetModuleHandle(moduleName);
        if (moduleHandle == IntPtr.Zero)
        {
            return false;
        }
        return (GetProcAddress(moduleHandle, methodName) != IntPtr.Zero);
    }

    [DllImport("kernel32.dll")]
    static extern IntPtr GetCurrentProcess();

    [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
    static extern IntPtr GetModuleHandle(string moduleName);

    [DllImport("kernel32", CharSet = CharSet.Auto, SetLastError = true)]
    static extern IntPtr GetProcAddress(IntPtr hModule,
        [MarshalAs(UnmanagedType.LPStr)]string procName);

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool IsWow64Process(IntPtr hProcess, out bool wow64Process);

WMIのバージョンも利用できます(リモートマシンのテスト用)。


1
このコードは、Microsoft Public Licenseの下でライセンスされていることに注意してください。
ladenedge 2011

マネージド.netなしのWMIバージョン?私はそれを見たいのですが、今のところ見つけていません
JohnZaj '28

16

また、 PROCESSOR_ARCHITECTURE環境変数をます。

存在しないか、32ビットWindowsで「x86」に設定されています。

private int GetOSArchitecture()
{
    string pa = 
        Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE");
    return ((String.IsNullOrEmpty(pa) || 
             String.Compare(pa, 0, "x86", 0, 3, true) == 0) ? 32 : 64);
}

1
64ビットプロセッサを使用しているからといって、64ビットOSを使用しているわけではありません
David

2
@DavidこれはWindowsのプロセッサアーキテクチャを報告します。CPUではありません。このページの「The Code」から始まる詳細な説明を参照してください:andrewensley.com/2009/06/c-detect-windows-os-part-1
Andrew Ensley 2013年

これを実行すると、アプリがに設定されている場合にだけ、2セントを追加するprefer 32-bitAny CPU、あなたのようにPlatform Target、あなたが取得しますx86が、あなたは外します場合はPrefer 32-bit、それをあなたがして取得しますAMD64
XAMlMAX 2018

14

Chriz Yuenブログから

C#.Net 4.0 2つの新しい環境プロパティEnvironment.Is64BitOperatingSystemが導入されました。Environment.Is64BitProcess;

これら両方のプロパティを使用するときは注意してください。Windows 7 64ビットマシンでテストする

//Workspace: Target Platform x86
Environment.Is64BitOperatingSystem True
Environment.Is64BitProcess False

//Workspace: Target Platform x64
Environment.Is64BitOperatingSystem True
Environment.Is64BitProcess True

//Workspace: Target Platform Any
Environment.Is64BitOperatingSystem True
Environment.Is64BitProcess True

12

最速の方法:

if(IntPtr.Size == 8) {
    // 64 bit machine
} else if(IntPtr.Size == 4)  {
    // 32 bit machine
} 

注:これは非常に直接的であり、プログラムが32ビットプロセスとして実行を強制しない場合にのみ(たとえば<Prefer32Bit>true</Prefer32Bit>、プロジェクト設定で)、64ビットで正しく機能します。


32
これは機能しません-64ビットWindows上の32ビット.NET Framework 2.0で実行している場合、32ビットを返します。
Stefan Schultze

右この状況を忘れてしまいました。これについても言及するように質問を編集しました。stefan-mgに感謝します。
マルク・

1
これは正しくありません。プラットフォームは64ビットかもしれませんが、それでも32ビットモードで実行しています。
セバスチャングッド

11

これを試して:

Environment.Is64BitOperatingSystem

Environment.Is64BitProcess

5
ご入力ありがとうございます。このソリューションはすでに提供されているため、投稿する前に利用可能な回答をお読みください。また、ノート元の質問は、.NET 4でのみ導入されたこの2つのプロパティがありません。ネット2程度だったこと
マルク・

9

@foobar:あなたは正しい、それはあまりにも簡単です;)

99%のケースで、システム管理者のバックグラウンドが弱い開発者は、最終的にMicrosoftがWindowsを列挙するためにMicrosoftが常に提供してきた力を理解できません。

システム管理者は、そのような点に関しては、常により優れた単純なコードを作成します。

ただし、この環境変数が正しいシステムで正しい値を返すには、ビルド構成がAnyCPUである必要があります。

System.Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE")

これにより、32ビットWindowsでは「X86」、64ビットWindowsでは「AMD64」が返されます。


4
あなたのソリューションは、Windows 7 UltimateパーティションでBootcampを実行するIntel i7-3720QMマイクロプロセッサを搭載したMacBook Proでx86を返します。Stefan Schultzeのソリューションは、プロセッサを64ビットとして適切に識別しました。私はあなたの解決策がWindowsベースのPCの99%で動作することを確信しています。試すための+1。
Mark Kram

いいえ。Windows 7 Pro、64ビットオペレーティングシステムで「x86」を返しました。
Hagai L

7

dotPeekを使用すると、フレームワークが実際にそれを行う方法を確認できます。それを念頭に置いて、私が思いついたのは次のとおりです。

public static class EnvironmentHelper
{
    [DllImport("kernel32.dll")]
    static extern IntPtr GetCurrentProcess();

    [DllImport("kernel32.dll")]
    static extern IntPtr GetModuleHandle(string moduleName);

    [DllImport("kernel32")]
    static extern IntPtr GetProcAddress(IntPtr hModule, string procName);

    [DllImport("kernel32.dll")]
    static extern bool IsWow64Process(IntPtr hProcess, out bool wow64Process);

    public static bool Is64BitOperatingSystem()
    {
        // Check if this process is natively an x64 process. If it is, it will only run on x64 environments, thus, the environment must be x64.
        if (IntPtr.Size == 8)
            return true;
        // Check if this process is an x86 process running on an x64 environment.
        IntPtr moduleHandle = GetModuleHandle("kernel32");
        if (moduleHandle != IntPtr.Zero)
        {
            IntPtr processAddress = GetProcAddress(moduleHandle, "IsWow64Process");
            if (processAddress != IntPtr.Zero)
            {
                bool result;
                if (IsWow64Process(GetCurrentProcess(), out result) && result)
                    return true;
            }
        }
        // The environment must be an x86 environment.
        return false;
    }
}

使用例:

EnvironmentHelper.Is64BitOperatingSystem();

6

次の2つの環境変数(疑似コード)を使用します。

if (PROCESSOR_ARCHITECTURE = x86 &&
    isDefined(PROCESSOR_ARCHITEW6432) &&
    PROCESSOR_ARCHITEW6432 = AMD64) {

    //64 bit OS
}
else
    if (PROCESSOR_ARCHITECTURE = AMD64) {
        //64 bit OS
    }
    else
        if (PROCESSOR_ARCHITECTURE = x86) {
            //32 bit OS
        }

ブログ投稿HOWTO:Detect Process Bitnessを参照してください。


質問がC / C ++ではなく.NETに関する部分を見ましたか?そして、これはコンパイル時と実行時チェックです。また、コードは比較ではなく割り当てを行っています。
dvallejo 2013年

このコードは.NETで動作します(2.0でテスト済み)。環境変数には、次の方法でアクセスできます。Environment.GetEnvironmentVariable( "PROCESSOR_ARCHITECTURE"); Environment.GetEnvironmentVariable( "PROCESSOR_ARCHITEW6432");
andrew.fox 2013年

5

多くのオペレーティングシステムでこのチェックを使用して成功しました。

private bool Is64BitSystem
{
   get
   {
      return Directory.Exists(Environment.ExpandEnvironmentVariables(@"%windir%\SysWOW64"));
   }
}

このフォルダの名前は、オペレーティングシステムの言語に関係なく、常に「SysWOW64」です。これは.NET Framework 1.1以降で機能します。


そして、何と呼ばれるフォルダの作成から管理者権限を持つユーザーとして私を防ぐSysWOW64上での%windir%32ビットOS上で?フォルダの存在とは、フォルダが存在することを意味します。
cogumel0

ユーザーが故意にそのようなフォルダを作成する可能性は何ですか?これは、オペレーティングシステムがx64かどうかを確認する別の方法です。
Alexandru Dicu

コンピュータがウイルスに感染する可能性はどのくらいありますか?可能性は非常に低いので、保護をインストールしない方がいいでしょう...プログラミングは、故意に失敗する可能性が低いものを作成することではありません。それは、無意識のうちに失敗する可能性が低いものを作成し、それを修正することです。前者は悪いプログラミング/悪い実装と呼ばれ、後者はバグと呼ばれます。
cogumel0

@AlexandruDicuこのアプローチは100%正確ではなく、サードパーティのアプリまたはユーザーが手動でフォルダーを作成した場合に誤った出力が出るリスクがあることを回答で言及する必要があります。
Rajesh Mishra

4

私はこれを行う必要がありますが、管理者がリモートで行うことができる必要もあります。どちらの場合も、これは私にとって非常にうまく機能しているようです:

    public static bool is64bit(String host)
    {
        using (var reg = RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, host))
        using (var key = reg.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\"))
        {
            return key.GetValue("ProgramFilesDir (x86)") !=null;
        }
    }

4

これは、http://1code.codeplex.com/SourceControl/changeset/view/39074#842775にあるMicrosoftのコードに基づくソリューションです。拡張メソッドを使用して、コードを簡単に再利用できます。

いくつかの可能な使用法を以下に示します。

bool bIs64BitOS = System.Environment.OSVersion.IsWin64BitOS();

bool bIs64BitProc = System.Diagnostics.Process.GetCurrentProcess().Is64BitProc();

//Hosts the extension methods  
public static class OSHelperTools  
{  
    /// <summary>     
    /// The function determines whether the current operating system is a      
    /// 64-bit operating system.     
    /// </summary>     
    /// <returns>     
    /// The function returns true if the operating system is 64-bit;      
    /// otherwise, it returns false.     
    /// </returns>    
    public static bool IsWin64BitOS(this OperatingSystem os)  
    {  
        if (IntPtr.Size == 8)  
        // 64-bit programs run only on Win64           
            return true;   
        else// 32-bit programs run on both 32-bit and 64-bit Windows     
        {   // Detect whether the current process is a 32-bit process                
            // running on a 64-bit system.               
            return Process.GetCurrentProcess().Is64BitProc();  
        }  
    }  

    /// <summary>  
    /// Checks if the process is 64 bit  
    /// </summary>  
    /// <param name="os"></param>  
    /// <returns>  
    /// The function returns true if the process is 64-bit;        
    /// otherwise, it returns false.  
    /// </returns>    
    public static bool Is64BitProc(this System.Diagnostics.Process p)  
    {  
        // 32-bit programs run on both 32-bit and 64-bit Windows           
        // Detect whether the current process is a 32-bit process                
        // running on a 64-bit system.               
        bool result;  
        return ((DoesWin32MethodExist("kernel32.dll", "IsWow64Process") && IsWow64Process(p.Handle, out result)) && result);  
    }  

    /// <summary>     
    /// The function determins whether a method exists in the export      
    /// table of a certain module.     
    /// </summary>     
    /// <param name="moduleName">The name of the module</param>     
    /// <param name="methodName">The name of the method</param>     
    /// <returns>     
    /// The function returns true if the method specified by methodName      
    /// exists in the export table of the module specified by moduleName.     
    /// </returns>       
    static bool DoesWin32MethodExist(string moduleName, string methodName)  
    {  
        IntPtr moduleHandle = GetModuleHandle(moduleName);  
        if (moduleHandle == IntPtr.Zero)  
            return false;    
        return (GetProcAddress(moduleHandle, methodName) != IntPtr.Zero);   
    }  
    [DllImport("kernel32.dll")]  
    static extern IntPtr GetCurrentProcess();  

    [DllImport("kernel32.dll", CharSet = CharSet.Auto)]  
    static extern IntPtr GetModuleHandle(string moduleName);  

    [DllImport("kernel32", CharSet = CharSet.Auto, SetLastError = true)]  
    static extern IntPtr GetProcAddress(IntPtr hModule, [MarshalAs(UnmanagedType.LPStr)]string procName);  

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]  
    [return: MarshalAs(UnmanagedType.Bool)]  
    static extern bool IsWow64Process(IntPtr hProcess, out bool wow64Process);  
}

CodePlexリンクが壊れているようです。
Peter Mortensen 2013年

3

このページの DllImportを使用したC#での直接的なアプローチは次のとおりです

[DllImport("kernel32.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi)] 
[return: MarshalAs(UnmanagedType.Bool)] 
public static extern bool IsWow64Process([In] IntPtr hProcess, [Out] out bool lpSystemInfo); 

public static bool Is64Bit() 
{ 
    bool retVal; 

    IsWow64Process(Process.GetCurrentProcess().Handle, out retVal); 

    return retVal; 
} 

最初にポインタサイズを確認する必要があります。それ以外の場合は、64ビットシステムの32ビットプロセスかどうかを確認するだけです
Bruno Lopes

1
また、IsWow64Process存在しないため、古いOSでクラッシュします。
多項式2012年

3

次のコードを使用しています。注:これはAnyCPUプロジェクト用に作成されています。

    public static bool Is32bitProcess(Process proc) {
        if (!IsThis64bitProcess()) return true; // We're in 32-bit mode, so all are 32-bit.

        foreach (ProcessModule module in proc.Modules) {
            try {
                string fname = Path.GetFileName(module.FileName).ToLowerInvariant();
                if (fname.Contains("wow64")) {
                    return true;
                }
            } catch {
                // What on earth is going on here?
            }
        }
        return false;
    }

    public static bool Is64bitProcess(Process proc) {
        return !Is32bitProcess(proc);
    }

    public static bool IsThis64bitProcess() {
        return (IntPtr.Size == 8);
    }

2

これがシステムのプラットフォームとプロセスを確認する最良の方法であることがわかりました。

bool 64BitSystem = Environment.Is64BitOperatingSystem;
bool 64BitProcess = Environment.Is64BitProcess;

最初のプロパティは、64ビットシステムの場合はtrue、32ビットシステムの場合はfalseを返します。2番目のプロパティは、64ビットプロセスの場合はtrue、32ビットプロセスの場合はfalseを返します。

これらの2つのプロパティが必要なのは、64ビットシステムで32ビットプロセスを実行できるため、システムとプロセスの両方を確認する必要があるためです。


1
変数名の前に_または文字を入れて、C#で作成したい場合(変数の名前は、私のIDEが伝えている限り、C#の数字で始めないでください)
Chris

2

すべて問題ありませんが、これも次のように機能しenvます。

PROCESSOR_ARCHITECTURE=x86

..

PROCESSOR_ARCHITECTURE=AMD64

簡単すぎる、多分;-)


2

これは、Windows Management Instrumentation(WMI)アプローチです。

string _osVersion = "";
string _osServicePack = "";
string _osArchitecture = "";

ManagementObjectSearcher searcher = new ManagementObjectSearcher("select * from Win32_OperatingSystem");
ManagementObjectCollection collection = searcher.Get();

foreach (ManagementObject mbo in collection)
{
    _osVersion = mbo.GetPropertyValue("Caption").ToString();
    _osServicePack = string.Format("{0}.{1}", mbo.GetPropertyValue("ServicePackMajorVersion").ToString(), mbo.GetPropertyValue("ServicePackMinorVersion").ToString());

    try
    {
        _osArchitecture = mbo.GetPropertyValue("OSArchitecture").ToString();
    }
    catch
    {
        // OSArchitecture only supported on Windows 7/Windows Server 2008
    }
}

Console.WriteLine("osVersion     : " + _osVersion);
Console.WriteLine("osServicePack : " + _osServicePack);
Console.WriteLine("osArchitecture: " + _osArchitecture);

/////////////////////////////////////////
// Test on Windows 7 64-bit
//
// osVersion     : Microsoft Windows 7 Professional
// osservicePack : 1.0
// osArchitecture: 64-bit

/////////////////////////////////////////
// Test on Windows Server 2008 64-bit
//    --The extra r's come from the registered trademark
//
// osVersion     : Microsoftr Windows Serverr 2008 Standard
// osServicePack : 1.0
// osArchitecture: 64-bit

/////////////////////////////////////////
// Test on Windows Server 2003 32-bit
//    --OSArchitecture property not supported on W2K3
//
// osVersion     : Microsoft(R) Windows(R) Server 2003, Standard Edition
// osServicePack : 2.0
// osArchitecture:

1

OSInfo.Bits

using System;
namespace CSharp411
{
    class Program
    {
        static void Main( string[] args )
        {
           Console.WriteLine( "Operation System Information" );
           Console.WriteLine( "----------------------------" );
           Console.WriteLine( "Name = {0}", OSInfo.Name );
           Console.WriteLine( "Edition = {0}", OSInfo.Edition );
           Console.WriteLine( "Service Pack = {0}", OSInfo.ServicePack );
           Console.WriteLine( "Version = {0}", OSInfo.VersionString );
           Console.WriteLine( "Bits = {0}", OSInfo.Bits );
           Console.ReadLine();
        }
    }
}

3
それはすばらしいことですが、このクラスはMicrosoft WSUSであるMicrosoft.UpdateServices.Administration名前空間からのものです。プラットフォームのビットを知るためだけにこのリファレンスを含めるのは好きではありません。
マルク

"C:\ Program Files \ Microsoft.NET \ SDK \ v2.0 64bit \ LateBreaking \ PlatformInvoke \ WinAPIs \ OSInfo \ CS \ OSInfoCS.sln"
AMissico

1

次のコードをプロジェクトのクラスに含めます。

    [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 int GetBit()
    {
        int MethodResult = "";
        try
        {
            int Architecture = 32;

            if ((Environment.OSVersion.Version.Major == 5 && Environment.OSVersion.Version.Minor >= 1) || Environment.OSVersion.Version.Major >= 6)
            {
                using (Process p = Process.GetCurrentProcess())
                {
                    bool Is64Bit;

                    if (IsWow64Process(p.Handle, out Is64Bit))
                    {
                        if (Is64Bit)
                        {
                            Architecture = 64;

                        }

                    }

                }

            }

            MethodResult = Architecture;

        }
        catch //(Exception ex)
        {
            //ex.HandleException();
        }
        return MethodResult;
    }

次のように使用します。

string Architecture = "This is a " + GetBit() + "bit machine";

0

これを使用して、インストールされているWindowsアーキテクチャを取得します。

string getOSArchitecture()
{
    string architectureStr;
    if (Directory.Exists(Environment.GetFolderPath(
                           Environment.SpecialFolder.ProgramFilesX86))) {
        architectureStr ="64-bit";
    }
    else {
        architectureStr = "32-bit";
    }
    return architectureStr;
}

w7x64 vs.net 2010にProgramFilesX86プロパティがありません
Christian Casutt

0

受け入れられた答えが非常に複雑であることを考えると。より簡単な方法があります。鉱山はalexandrudicuの回答のバリエーションです。64ビットWindowsが32ビットアプリケーションをProgram Files(x86)にインストールする場合、環境変数を使用してそのフォルダーが存在するかどうかを確認できます(さまざまなローカリゼーションを補うため)

例えば

private bool Is64BitSystem
{
   get
   {
      return Directory.Exists(Environment.ExpandEnvironmentVariables(@"%PROGRAMFILES(X86)%"));
   }
}

これは私にとってはより速くて簡単です。OSバージョンに基づいて、そのフォルダーの下の特定のパスにもアクセスしたいとします。


2
受け入れられた答えは.NET 2.0に対するものでした。.NET 4.0以降を使用している場合は、ほとんどの投票で回答にあるように、Environment.Is64BitOperatingSystemを使用してください。
Marc

はい、私も.net 2.0用です。
John Demetriou 2017年

-2

楽しい ;-)

Function Is64Bit() As Boolean

    Return My.Computer.FileSystem.SpecialDirectories.ProgramFiles.Contains("Program Files (x86)")

End Function

これはローカライズされたWindowsインストールでは機能しないため、-1。また、VB.netを使用していますが、質問にはC#のタグが付いています。
Marc

-3

「C:\ Program Files(x86)」が存在するかどうかを確認してください。そうでない場合は、32ビットOSを使用しています。サポートしている場合、OSは64ビットです(Windows VistaまたはWindows 7)。シンプルなようです...


5
ハードコーディングするのではなく、Win32 APIから正しいローカライズされたディレクトリ名を取得してください。
クリスチャンヘイター

それは良い考えだと思いますが、ユーザーが何らかの理由でこれを実行しないとは限りません。
GurdeepS、2011

2
一部の不適切に記述されたアプリケーションは、アーキテクチャに関係なく「Program Files(x86)」に直接インストールされるようになりました。たとえば、SOAPSonarのおかげで、32ビットマシンにそのディレクトリがあります。
ladenedge 2011

-4

私が使う:

Dim drivelet As String = Application.StartupPath.ToString
If Directory.Exists(drivelet(0) & ":\Program Files (x86)") Then
    MsgBox("64bit")
Else
    MsgBox("32bit")
End if

これにより、アプリケーションがコンピューターのさまざまな場所にインストールされている場合に、アプリケーションが起動されるパスが取得されます。また、C:\そこにあるコンピュータの99.9%にWindowsがインストールされているため、一般的なパスを実行するだけで済みますC:\


8
非常に悪いアプローチ。将来このディレクトリの名前が変更されるとどうなりますか?Windowsのローカライズバージョンはどうですか?Windows XPでは、ドイツ語で「Program Files」は「Programme」と呼ばれています。よくわかりませんが、XP 64では「プログラム(x86)」と呼んでいる可能性があります。
マルク

1
お勧めしませんが、環境変数%ProgramFiles(x86)%を拡張することでローカリゼーションの問題を回避できます
Matthew Lock

-7

次のバージョンを使用しています。

    public static bool Is64BitSystem()
    {
        if (Directory.Exists(Environment.GetEnvironmentVariable("Program Files (x86)"))) return true;
        else return false;
    }

6
ローカライズされたプログラムフォルダー名のため、これは英語以外のXPバージョンでは機能しません。
DanielSchlößer

しかし、64ビットシステムにもこのフォルダがあります
注意深い1
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.