2009-04-20 9 views
17

ユーザーが実行しているCPUアーキテクチャを確認したいですか。 i386またはX64またはAMD64です。私はC#でそれをやりたい 私はWMIまたはレジストリを試すことができると知っています。これらの2つから離れて他の方法はありますか? 私のプロジェクトは.NET 2.0をターゲットにしています!C#を使用してCPUアーキテクチャの種類を特定する

答えて

25

また、(それが操作していない場合にのみ動作)を試みることができる:

System.Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE") 
+1

設定されていない場合はどうなりますか? –

+0

設定されていない場合(少なくともVistaの場合、デフォルトで設定されています)。私はこれを別の方法として提案しました。必ずしも最良の方法ではありません。 –

+0

いい答えですが。 –

0

おそらくユーザーに質問できますか?

ちょうど冗談...私はWMIがあなたのために使うものだと思います。しかし、おそらく他にもいくつかの方法がありますか?

WMIの場合、LinqToWmiを使用できます。私は一度試してみましたが、それはまっすぐに見えました=) - >http://www.codeplex.com/linq2wmi

6

Win32_Processor WMIクラスは仕事をします。強く型付けされたラッパーを生成するにはMgmtClassGen.exeを使用してください。

+2

これはおそらく質問に対する最良の答えです。 –

+0

これは私を助けました!ありがとう+1! –

+0

Win32_Processorクラスはどのように役立つはずですか? OSArchitectureについて話していた場合、このプロパティはほとんどのWindowsバージョンでは利用できませんが、いくつかの最新バージョンでのみサポートされています。 – ivan

1

たぶんthis CodeProjectの記事が役立つかもしれませんか?これは、System.Management名前空間のManagementObjectSearcherを使用してハードウェア情報を検索します。

0

私は..あなたは、WMIとLINQのような重い肥大化を避けるべきであると信じて、あなたが肥大化するAPIやフレームワークによって満たされるいずれも、一緒に行くと、あなたは最終的に、より多くの情報を取得する必要があります。

CPUID情報を呼び出して抽出するDLLを呼び出すだけです。 C++/CLIまたはpinvokeを使用すると、ベンダーに必要なすべての情報が得られます。まず、その命令がサポートされているかどうか(その時間の99%)を確認する必要があります。稼働してすぐに取得するには

はwincpuidサンプル用のインテルのサイトをチェックして、そこからcpuid.hから曲を抽出することです。そこだけ2つのベンダーであり、1はメモリ・レイテンシと良好であり、他の一つは(マネージコード対ネイティブのような)ではありません。だから、(ところでない人)他のアーキテクチャなどにモノラルに問題があるでしょう。 x64のためとして、あなたはすでにそれを知っているか、単に(そのそこにすでにと.NETの配布を使用して、顧客のハードドライブを殺す)corflagsを取得。..

http://software.intel.com/en-us/articles/api-detects-ia-32-and-x64-platform-cpu-characteristics/

+0

が既に考えを表明いただきありがとうござい見ます私はWMIを使用することの提案を読んだとき(これは嘆きを引き出した)持っていました。 –

+0

あなたのintel.comへのリンクは、現在死んでいます。 –

-3

ここに私がやったことだ:

public static bool Isx86() 
{ 
    return (Environment.ExpandEnvironmentVariables("%ProgramFiles(x86)%").Length == 0); 
} 

64ビットアーキテクチャの場合は、2つのプログラムファイルのenv変数があります。あなたがx86上にいるならば、あなたはそれを持っているだけです。

+0

あなたが心配するのは、32ビットと64ビットの別名x86 vs x64だけです。次のBCLプロパティEnvironment.Is64BitOperatingSystemを使用してください。 –

-1

これは私には、最も単純なようだ:ここに私を導いた何

System.Environment.Is64BitOperatingSystem 
+2

.NET 4.0については、.NET 4.0に関する質問がありますが、 – ivan

16

は32〜64対ビットのOSのためにチェックしています。最高の定格答えが現在のプロセスの設定を見ています。答えが見つからないと、私は次の設定を見つけました。これはあなたのために働くことを望みます。ここで

bool is64 = System.Environment.Is64BitOperatingSystem 
+4

.NET Framework 4+ –

+1

古いスレッドを復活させて申し訳ありませんが、将来の読者の助言として:32ビットプロセスは64ビットOS上でうまく動作できるので、 'System.Environment.Is64BitProcess'は私の場合にはもっと便利でした('アーキテクチャに基づいて "正しい" sqlite3.dll'のためのPATH'変数)。私の場合、OSは実際64ビットでしたが、別のライブラリのために私のアプリケーションを32ビットとしてコンパイルする必要がありました。 – nurchi

+0

Is64BitProcessは少なくともバージョン4まで登場しませんでした。どのバージョンでも、私はIntPtr.Sizeが最も洗練されたソリューションだと思います。私はこのページに私を連れて来たコードの中に3進表現を巻きました。 –

9

は(P /呼び出しに基づいて)動作するようですコードの一部です:

[DllImport("kernel32.dll")] 
    private static extern void GetNativeSystemInfo(ref SYSTEM_INFO lpSystemInfo); 

    private const int PROCESSOR_ARCHITECTURE_AMD64 = 9; 
    private const int PROCESSOR_ARCHITECTURE_IA64 = 6; 
    private const int PROCESSOR_ARCHITECTURE_INTEL = 0; 

    [StructLayout(LayoutKind.Sequential)] 
    private struct SYSTEM_INFO 
    { 
     public short wProcessorArchitecture; 
     public short wReserved; 
     public int dwPageSize; 
     public IntPtr lpMinimumApplicationAddress; 
     public IntPtr lpMaximumApplicationAddress; 
     public IntPtr dwActiveProcessorMask; 
     public int dwNumberOfProcessors; 
     public int dwProcessorType; 
     public int dwAllocationGranularity; 
     public short wProcessorLevel; 
     public short wProcessorRevision; 
    } 

注意と

public static ProcessorArchitecture GetProcessorArchitecture() 
    { 
     SYSTEM_INFO si = new SYSTEM_INFO(); 
     GetNativeSystemInfo(ref si); 
     switch (si.wProcessorArchitecture) 
     { 
      case PROCESSOR_ARCHITECTURE_AMD64: 
       return ProcessorArchitecture.Amd64; 

      case PROCESSOR_ARCHITECTURE_IA64: 
       return ProcessorArchitecture.IA64; 

      case PROCESSOR_ARCHITECTURE_INTEL: 
       return ProcessorArchitecture.X86; 

      default: 
       return ProcessorArchitecture.None; // that's weird :-) 
     } 
    } 

このコードは、既存のCLRのProcessorArchitecture列挙型を再利用し、 .NET Framework 2以上をサポートしています。

+0

ありがとう、これは素晴らしい作品です...私はマシンタイプがOSのタイプではないことを期待しています。 –

+0

サイモン、これははるかにもっともリーンなソリューションです。 Platform Invokeを恐れている人は誰でもそれを乗り越えてください。それは(通常)噛まない! –

5

最後にC#で現在実行中のCLRランタイムのためのプラットフォーム/プロセッサアーキテクチャを解決するための最短のトリックである:

PortableExecutableKinds peKind; 
ImageFileMachine machine; 
typeof(object).Module.GetPEKind(out peKind, out machine); 

ここModule.GetPEKindは、.NET V2ので存在ImageFileMachine列挙を返す:

public enum ImageFileMachine 
{ 
    I386 = 0x014C, 
    IA64 = 0x0200, 
    AMD64 = 0x8664, 
    ARM  = 0x01C4 // new in .NET 4.5 
} 

なぜ使用しないでくださいnew AssemblyName(fullName)またはtypeof(object).Assembly.GetName()
まあ(1.0以降)ASP.NET MVCのソースコード内でこのHACKコメントがある:

private static string GetMvcVersionString() { 
    // DevDiv 216459: 
    // This code originally used Assembly.GetName(), but that requires FileIOPermission, which isn't granted in 
    // medium trust. However, Assembly.FullName *is* accessible in medium trust. 
    return new AssemblyName(typeof(MvcHttpHandler).Assembly.FullName).Version.ToString(2); 
} 

は、彼らが自分たちのためにいくつかの隠し技を使うを参照してください。残念ながら、AssemblyNameコンストラクタはProcessorArchitectureフィールドを適切に設定しません。新しいAssemblyNameの場合はNoneになります。

今後の読者には、その醜いGetPEKindをImageFileMachineで使用することをお勧めします。

注:

  • これは、現在実行中のランタイムアーキテクチャではなく、基本的なシステムアーキテクチャを返します!
    しかし、唯一の例外は、I386ランタイムがAMD64システム上で動作することです。
  • mono/ubuntu 14.04/AMD64および.NET/Win7/I386でテスト済みです。
0

なぜ知りたいのかによって、IntPtr構造体のサイズを確認するのが最も簡単です。

+0

私は匿名臆病者の考え方が好きです! –

2

私はこの質問は過去からですが、2017年のように、.NETの標準で、現在のプロセスのアーキテクチャを知るための簡単な方法は、今があることを知っている:

System.Runtime.InteropServices.RuntimeInformation.ProcessArchitecture 

返された値がありますX86、X64、ARM、ARM64のいずれかであり、実行中のプロセスのアーキテクチャを示します。OSArchitectureは、インストールされたオペレーティングシステムのアーキテクチャを返します。 (ただし、かなり役に立たない...)ドキュメントへ

リンク:

RuntimeInformation.ProcessArchitecture: https://docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.runtimeinformation.processarchitecture?view=netstandard-1.4

アーキテクチャの列挙:これについて https://docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.architecture?view=netstandard-1.4

0

どのように?

switch (typeof(string).Assembly.GetName().ProcessorArchitecture) { 
    case System.Reflection.ProcessorArchitecture.X86: 
     break; 
    case System.Reflection.ProcessorArchitecture.Amd64: 
     break; 
    case System.Reflection.ProcessorArchitecture.Arm: 
     break; 
} 

case *.Arm:はまだテストされていません。

関連する問題