NET-Framework 2.0: Läuft meine Anwendung aktuell in einem 64-Bit-Betriebssystem?

Windows gibt es seit der Version XP auch als 64-Bit-Version. Richtig durchgesetzt hat sich das aber erst seit dem grandiosen Start von Windows 7. Nahezu 50der Rechner laufen hier unter der superschnellen 64-Spuren-Stadtautobahn, Tendenz steigend.

Da 32-Bit- und 64-Bit-Betriebssysteme sich auch in ihrer Reaktion unterscheiden und teilweise verschiedene Verfahren für Berechtigungen haben, ist es manchmal innerhalb einer .NET-Anwendung notwendig zu wissen, auf welcher Version die Anwendung gerade läuft. Dummerweise war zur Einführung von .NET Framework 2.0 noch nicht bekannt, dass es einmal Win7-64 geben wird, und so kann man auch nicht einfach auf einen Namespace zugreifen, der einem das sagt.

Aber es gibt auch in .NET Framework 2.0 eine Möglichkeit, mit Hilfe der Kernel.dll herauszufinden, auf wieviel Bit-Spuren man unterwegs ist. Hier mein Vorschlag:

' Namespace InteropServices wird benoetigt
Imports System.Runtime.InteropServices

    ''' <summary>Globales Modul ob OS 64-Bit ist</summary>
    Module Check64BitOS

        ''' <summary>
        ''' Die public-Funktion kann aufgerufen werden, um ein 64-Bit-Betriebssystem zu entdecken
        ''' </summary>
        ''' <returns>True wenn 64-Bit-System</returns>
        Public Function Is64BitOperatingSystem() As Boolean
            If ( IntPtr.Size = 8 ) Then  ' Nur 64-bit kann mit dieser Size arbeiten (32-Bit = 4)
                Return True
            Else  ' 32-bit Programme koennen auch im 64-Bit Modus laufen, daher ist der Prozess zu pruefen
                Dim flag As Boolean
                Return ((DoesWin32MethodExist("kernel32.dll", "IsWow64Process") _
                         AndAlso IsWow64Process(GetCurrentProcess, flag)) AndAlso flag)
            End If
        End Function

        ''' <summary>Diese kleine Funktion prüft, ob
        '''          a) eine Bibliothek existiert und
        '''          b) eine Methode innerhalb dieser Methode existiert
        ''' </summary>
        ''' <param name="moduleName">zu untersuchender Modulname</param>
        ''' <param name="methodName">zu suchende Methode</param>
        ''' <returns>True wenn Modul und Methode existieren</returns>
        Function DoesWin32MethodExist(ByVal moduleName As String, ByVal methodName As String) As Boolean
            Dim moduleHandle As IntPtr = GetModuleHandle(moduleName)
            If (moduleHandle = IntPtr.Zero) Then
                Return False
            End If
            Return (GetProcAddress(moduleHandle, methodName) <> IntPtr.Zero)
        End Function

        <DllImport("kernel32.dll")> _
        Function GetCurrentProcess() As IntPtr
        End Function

        <DllImport("kernel32.dll", CharSet:=CharSet.Auto)> _
        Function GetModuleHandle(ByVal moduleName As String) As IntPtr
        End Function

        <DllImport("kernel32", CharSet:=CharSet.Auto, SetLastError:=True)> _
        Function GetProcAddress(ByVal hModule As IntPtr, _
                                <MarshalAs(UnmanagedType.LPStr)> _
                                ByVal procName As String) _
                                As IntPtr
        End Function

        <DllImport("kernel32.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _
        Function IsWow64Process(ByVal hProcess As IntPtr, _
                                <Out()> ByRef wow64Process As Boolean) _
                                As <MarshalAs(UnmanagedType.Bool)> Boolean
        End Function
End Module

Hier müssen Sie lediglich die Methode Is64BitOperatingSystem aufrufen um zu erkennen, ob Sie in einem 64-Bit-System gelandet sind.

 


Advertisements

Über Sascha Wald
Die Garagenfirmen sind ausgegangen... jedenfalls hatte ich in meinem Leben schon viele Ideen, die andere auch umgesetzt haben. Einige konnten davon gut profitieren. Berufung zum Besserwisser eben. Hier auch ein paar Dinge, die das IT Leben einfacher machen.

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: