Beiträge getagged ‘.NET 3.5’

.NET 3.5 – 64bit PC/Betriebssystem erkennen

20 November 2010

Das .NET Framework 4 bietet ja mittlerweile eine Eigenschaft um auszulesen, ob es sich um ein 32 oder um ein 64bit Betriebssystem handelt. Doch im .NET Framework 3.5 ist eine solche Option nicht enthalten.

Datenbreite Prozessor
Um festzustellen, welche Datenbreite der Prozessor unterstützt kann einfach eine WMI Query auf Win32_Processor auf das Feld “DataWidth” abgesetzt werden.

Is64bitOS
Im MSDN Artikel zur IntPtr Größe habe ich die Information gefunden, dass die Größe des Datentyps auf einem 32bit Betriebssystem immer 4 ist und unter 64bit immer 8.

Doch was passiert, wenn ich eine 32bit Applikation in einem 64bit Betriebssystem ausführe?
Die Executable wird mit einer 32bit CLR ausgeführt und daraus resultiert wiederum eine IntPtr Größe von 4.

Glücklicherweise gibt es zum Feststellen einer solchen Situation eine Windows API Funktion – IsWow64Process. Diese liefert “true” zurück, wenn sie erfolgreich ausgeführt werden konnte. Das Resultat der Abfrage kann über den “out” parameter ermittelt werden. Dieser ist “true” wenn man sich auf eine 64bit System befindet, ansonsten nimmt er den Wert “false” an.

Doch nachdem das ein recht “junge” Funktion ist, wird sie erst ab WinXP SP2 unterstützt, daher sollte man unbedingt die Existenz dieser Funktion im Kernel überprüfen. (Vorgehensweise wird direkt im MSDN Artikel beschrieben).

C# Implementierung
Zuerst die P/Invokes für die Windows API Funktionen:

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

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

[DllImport("kernel32.dll", 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);

Funktion zum Überprüfen, ob die Funktion IsWow64Process existiert:

private bool DoesIsWow64ProcessExist()
{
IntPtr moduleHandle = GetModuleHandle("kernel32.dll");
if (moduleHandle == IntPtr.Zero)
return false;
return (GetProcAddress(moduleHandle, "IsWow64Process") != IntPtr.Zero);
}

Und abschließend die Funktion zur Überprüfung ob man sich auf einem 64bit System befindet:

public bool Is64BitOS()
{
bool bReturn = false;
if (IntPtr.Size == 8 )
{
bReturn = true;
}
else
{
bool bFlag;
if (DoesIsWow64ProcessExist())
{
IntPtr currentProc = GetCurrentProcess();
if (IsWow64Process(currentProc, out bFlag) && bFlag)
bReturn = true;
}
}
return bReturn;
}