2010-09-23 8 views
39

Mam aplikację .NET, która miała zostać skompilowana jako aplikacja tylko 32-bitowa. Podejrzewam, że mój serwer kompilacji tak naprawdę tego nie robi.Jak określić, czy aplikacja .NET ma 32 czy 64 bity?

Jak ustalić, czy aplikacja .NET jest rzeczywiście uruchomiona w trybie 32-bitowym?

+0

Nie jest jasne, o co prosisz - czy masz bibliotekę dll, którą chcesz sprawdzić, czy aplikację, którą chcesz sprawdzić? –

+0

@jaco - to nie powinno mieć znaczenia. Exe jest także zbiorem. Jego głównym punktem jest to, że musi być wykonana zewnętrznie, ponieważ wynikowy program jest wynikiem serwera kompilacji. – x0n

+0

To prawda, ale próbuję zrozumieć, na co on patrzy. Ale masz rację, to nie powinno mieć znaczenia. –

Odpowiedz

41

Jeśli starasz się, by sprawdzić, czy nie uruchomienie aplikacji pracuje w 32-bitowy czy 64-bitowy tryb, otwórz menedżera zadań i sprawdź, czy ma gwiazdkę (* 32) obok nazwy procesu.

Jeśli masz skompilowany dll i chcesz sprawdzić, czy to jest skompilowany w trybie 32-bitowym lub 64-bitowej, wykonaj następujące czynności (z related question). Myślę, że chcesz, abyś skompilował dll dla AnyCPU.

Otwórz wiersz polecenia programu Visual Studio i wpisz "corflags [your assembly]". Dostaniesz coś takiego:

 
c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC>corflags "C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Data.dll" 

Microsoft (R) .NET Framework CorFlags Conversion Tool. Version 3.5.21022.8 Copyright (c) Microsoft Corporation. All rights reserved. 

Version : v2.0.50727 
CLR Header: 2.5 
PE : PE32 
CorFlags : 24 
ILONLY : 0 
32BIT : 0 
Signed : 1 

Patrzysz na PE i 32bit specjalnie.

AnyCpu:

PE: PE32 32BIT 0

x86:

PE: PE32 32BIT 1

64:

PE: PE32 + 32BIT: 0

+1

Dzięki, właśnie tego chciałem. (Chociaż twoja odpowiedź trochę mnie wkurza, ponieważ wiedziałem, że CorFlags może zmienić ustawienie, ale nic w dokumentach nie mówi mi, że może to również przeczytać.) –

6

Cóż, jeśli używasz .NET 4.0, jest System.Environment.Is64BitProcess.

+1

Nie sądzę, że jest to odpowiedź na pytanie OP. –

+0

Czy w zespole nie ma flagi informującej o tym, czy JIT ma być 32, 64 czy też? –

+0

@Will A: Czy OP nie umieścił kodu w swojej aplikacji i nie wyświetliłby komunikatu podczas ładowania (lub czegoś podobnego)? To szczere pytanie - naprawdę myślałem, że właśnie tego chciał. Teraz, gdy widzę inne odpowiedzi, zdaję sobie sprawę, że może chciał czegoś poza samym procesem. –

7

Najszybszym sposobem jest prawdopodobnie gwiazdka (*) po nazwie w menedżerze zadań po uruchomieniu na komputerze 64-bitowym. Gwiazdka oznacza, że ​​działa w syswow64, ergo jest oznaczone jako 32-bitowe.

Innym sposobem jest uruchomienie programu corflags.exe, który wyświetli odpowiedź, której szukasz. Dotyczy to pakietu .NET SDK.

+0

Uzgodniono, Menedżer zadań jest * zawsze * dokładny. Corflagi pokazują tylko intencje. –

2

Jeśli chcesz przetestować non montażu programowo, można użyć corflags.exe

>corflags.exe <assembly> 

<listing of header information, among them the 32bit-ness> 
4

używam następujący kod:

[DllImport("kernel32.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi)] 
[return: MarshalAs(UnmanagedType.Bool)] 
public static extern bool IsWow64Process(
    [In] IntPtr hProcess, 
    [Out] out bool wow64Process 
); 

With:

public static bool IsProcess64(Process process) 
{ 
    if ((Environment.OSVersion.Version.Major == 5 && Environment.OSVersion.Version.Minor >= 1) || Environment.OSVersion.Version.Major >= 6) { 
     bool ret_val; 

     try { 
      if (!WindowsAPI.IsWow64Process(process.Handle,out ret_val)) ret_val = false; 
     } catch { 
      ret_val = false; 
     } 

     if (!ret_val && IntPtr.Size == 8) { 
      return true; 
     } else { 
      return false; 
     } 
    } else { 
     return false; 
    } 
} 

można przekazać Process.CurrentProcess lub podobny do tego.

+0

Ma to pewne wady, związane głównie z obsługą wyjątków: "catch-all" i-wszystko "klauzula będzie również złapać takie rzeczy jak OutOfMemoryException, ThreadAbortException, AccessViolationException, itp. wszystkie rzeczy, które sygnalizuje zły stan CLR i nie ma nic wspólnego z procesem, o którym mowa, nie jest 32-bitowym procesem w systemie 64-bitowym (WOW64). Następnie własność "Handle" zgłasza wyjątek, jeśli zostanie wywołana w procesie bez pozwolenia lub już go nie ma - może to być proces 32-bitowy. Wreszcie, jeśli IntPtr.Size ma wartość 64, proces jest 64-bitowy - nie ma potrzeby sprawdzania innych rzeczy. –

+0

To prawda, nie zmieniłem tego kodu od dłuższego czasu. Powinienem naprawdę rozwiązać wszystkie te problemy. – Lloyd

14

Aby to zrobić przy starcie ...

Można ocenić IntPtr.Size. Jeśli IntPtr.Size == 4, to jest to 32-bitowe (4 x 8). Jeśli IntPtr.Rozmiar == 8 to 64-bitowy (8 x 8)

+1

To brzmi jak środowisko wykonawcze, a nie czas projektowania. –

+0

whoops, moje złe. naprawiono :) –

+2

Nadal jest przydatny; jeśli chcesz podejmować decyzje oparte na platformie w czasie wykonywania. – Najeeb

1

Szukałem tych samych informacji i stwierdziłem, że od czasu Windows 8.1, nie ma już żadnej gwiazdki.

Masz kolumnę szczegółów Menedżera zadań o nazwie "Platforma". Jego zawartość to "32 bity" lub "64 bity".

Powiązane problemy