poniedziałek, 18 kwietnia 2011

Sprawdzamy platformę (x86/x64), z poziomu kodu C# [PL]

We wcześniejszych wpisach pojawiły się informacje na temat kompilacji assembly na różne platformy oraz narzędzi, które pozwalają sprawdzić na jaką platformę assembly zostało skompilowane. W tym wpisie znajdą się informacje jak to można zrobić z poziomu kodu źródłowego.

Sprawdzenie podczas działania

Aby sprawdzić podczas działania programu/procedury, to czy jest on/ona uruchomiona w kontekście 32, czy 64-bitowym w czasach przed .NET 4.0 należało posłużyć się pewnym trikiem, a mianowicie (tak jak już to pokazywałem wcześniej), trzeba sprawdzić coś charakterystycznego dla platformy, np. rozmiar IntPtr, który na platformie x86 jest równy 4, natomiast na platformie x64 rozmiar ten wynosi 8, np.:
String.Format( "IntPtr.Size={0}, Environment (proces) is x64: {1}", IntPtr.Size, IntPtr.Size == 8 );
Dużo łatwiej natomiast zrobić to na platformie .NET 4.0. Tutaj klasa Environment została rozszerzona o nowe właściwości:
  • Environment.Is64BitOperatingSystem - zwraca prawdę, gdy wywołanie ma miejsce pod 64-bitowym systemem operacyjnym
  • Environment.Is64BitProcess - zwraca prawdę w przypadku, gdy proces jest 64bitowy.

Sprawdzenie assembly

Wiele ciekawych informacji znaleźć można również ładując (lub wykorzystując już załadowane) assembly. W szczególności przeglądając:
  • AssemblyName,
  • Moduły.

AssemblyName

W tym przypadku tworzymy nazwę assembly (var AssemblyName = AssemblyName.GetAssemblyName( FileName );), następnie interesująca jest właściwość: ProcessorArchitecture, która dostarcza typ architektury, odpowiednio:

Nazwa
Opis

None
Nieznana lub niewyspecyfikowana kombinacja bitów dla procesora.

MSIL
Naturalna (Any - CPU)

X86
32-bitowy procesor, natywnie lub w środowisku Windows on Windows (WOW) na platformie 64-bit.

IA64
Procesory Intel Itanium Architecture (wcześniej określane mianem IA-64)

Amd64
Procesory 64-bit AMD i zgodne (większość obecnych, popularnych procesorów x64).

Moduły składowe Assembly

W tym przypadku możemy przejrzeć wszystkie moduły wchodzące w skład assembly:
        var MyAssembly = System.Reflection.Assembly.LoadFile( FileName );
        Module[] modules = MyAssembly.GetModules();
Następnie dla każdego modułu wywołać funkcję: Module.GetPEKind, by otrzymać informację na temat PortableExecutableKinds i ImageFileMachine.
UWAGA: w tym przypadku należy uważać, by aplikacja 32-bitowa nie próbowała załadować assembly 64-bitowego (i odwrotnie), gdyż wtedy zobaczymy: „System.BadImageFormatException: Could not load file or assembly ...”

UWAGA: To jak sprawdzić assembly i moduły pokazuje również aplikacja AInfo dołączona do projektu MPTS (http://mpts.codeplex.com/).
Promuj

Brak komentarzy:

Prześlij komentarz

Posty powiązane / Related posts