[解決済み】.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;
}
}
関連
-
[解決済み】GDI+、JPEG画像をMemoryStreamに変換する際にジェネリックエラーが発生しました。
-
[解決済み】プラットフォームが同じでも「不正なフォーマットでプログラムを読み込もうとしました。
-
[解決済み] エンティティタイプ <type> は、現在のコンテキストのモデルの一部ではありません。
-
[解決済み】MetadataException: 指定されたメタデータ・リソースをロードできない
-
[解決済み】Visual Studio: 操作を完了できませんでした。パラメータが正しくありません
-
[解決済み] ...基礎となる接続は閉じられました。予期しないエラーが受信で発生しました
-
[解決済み] Windowsにpipをインストールするにはどうしたらいいですか?
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み】WindowsでTCPまたはUDPポートをリッスンしているプロセスを見つけるにはどうすればよいですか?
-
[解決済み] C# - Windows 64ビット版でProgram Files (x86)を取得する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] [Solved] 1つ以上のエンティティで検証に失敗しました。詳細は'EntityValidationErrors'プロパティを参照してください [重複]。
-
[解決済み】WebForms UnobtrusiveValidationModeは、jqueryのScriptResourceMappingを必要とする
-
[解決済み】統合マネージドパイプラインモードで適用されないASP.NETの設定が検出された
-
[解決済み】WPFでXamlファイルにコメントを追加する方法は?
-
[解決済み] [Solved] 不正な文字列値: '\xEFxBFxBD' for column
-
[解決済み】"指定されたパスのフォーマットはサポートされていません。"
-
[解決済み】 C# 条件演算子エラー 代入、call、increment、decrement、await、new object 式のみ文として使用可能です。
-
[解決済み】画像のペイントにTextureBrushを使用する方法
-
[解決済み】ファイルやアセンブリ、またはその依存関係の1つをロードできませんでした。
-
[解決済み】データが存在しないのに読み込もうとする試みが無効である