2010-09-23 15 views
39

Possiedo un'applicazione .NET che dovrebbe essere compilata come applicazione solo a 32 bit. Sospetto che il mio server di build non lo stia facendo davvero.Come determinare se un'applicazione .NET è 32 o 64 bit?

Come determinare se un'applicazione .NET è effettivamente impostata per l'esecuzione in modalità a 32 bit?

+0

Non è chiaro cosa stai chiedendo: hai una DLL che vuoi controllare o un'applicazione che vuoi controllare? –

+0

@jaco - non dovrebbe avere importanza. Un exe è anche un assemblaggio. Il suo punto principale è che deve essere eseguito esternamente poiché il programma risultante è il risultato di un server di build. – x0n

+0

Vero, ma sto cercando di capire cosa sta guardando. Ma hai ragione, non dovrebbe importare. –

risposta

41

Se si sta cercando di verificare se un in esecuzione l'applicazione è in esecuzione in a 32-bit o 64-bit mode, aprire il task manager e verificare se ha o meno un asterisco (* 32) accanto al nome del processo.

Se si dispone di una dll compilato e si desidera controllare se è stato compilato per la modalità a 32 bit o 64 bit, procedere come segue (da un related question). Penso che tu voglia che tu venga compilato per AnyCPU.

Aprire il prompt dei comandi di Visual Studio e digitare "corflags [l'assembly]". Otterrete qualcosa di simile:

 
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 

Sei nella PE e 32BIT specifico.

AnyCPU:

PE: PE32 32BIT: 0

x86:

PE: PE32 32BIT: 1

x64:

PE: PE32 + 32BIT: 0

+1

Grazie, è esattamente quello che volevo. (Anche se la tua risposta mi fa incazzare un po 'perché sapevo che CorFlags poteva cambiare l'impostazione, ma nulla nel documento mi dice che può anche leggerlo.) –

6

Bene, se si utilizza .NET 4.0, c'è System.Environment.Is64BitProcess.

+1

Non penso che questo stia rispondendo alla domanda dell'OP. –

+0

Non c'è un contrassegno nell'assieme che dice se JIT in 32, 64 o entrambi? –

+0

@Will A: L'OP non ha potuto inserire quel codice nella sua app e farlo visualizzare un messaggio in fase di caricamento (o qualcosa del genere)? È una domanda onesta - ho davvero pensato che fosse quello che voleva. Ora che vedo alcune delle altre risposte mi rendo conto che forse voleva qualcosa al di fuori del processo stesso, però. –

7

Il modo più veloce è probabilmente che avrà un asterisco (*) dopo il suo nome in Task Manager quando viene eseguito su una macchina a 64 bit. L'asterisco significa che è in esecuzione in syswow64, ergo è contrassegnato a 32 bit.

L'altro modo è eseguire corflags.exe contro di esso e questo mostrerà la risposta che stai cercando. Questo viene fornito con .NET SDK.

+0

Concordato, il Task Manager è * sempre * accurato. Corflags mostra solo l'intento. –

2

Se si desidera verificare un non assemblaggio di programmazione, è possibile utilizzare corflags.exe

>corflags.exe <assembly> 

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

Io uso il seguente codice:

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

Con:

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; 
    } 
} 

È possibile passare Process.CurrentProcess o simile a questo.

+0

Questo ha alcuni difetti, in gran parte legati alla gestione delle eccezioni: il "catch-all" -e-tutto "la clausola prenderà anche cose come OutOfMemoryException, ThreadAbortException, AccessViolationException, ecc. tutto ciò che segnala uno stato negativo del CLR e non ha nulla a che fare con il processo in questione non essendo un processo a 32 bit su un sistema a 64 bit (WOW64). Quindi, la proprietà "Handle" genera un'eccezione se viene invocata per il processo senza autorizzazione o che è già stata eliminata - potrebbe comunque essere un processo a 32 bit. Infine, se IntPtr.Size è 64, il processo è a 64 bit: non è più necessario che gli altri elementi vengano controllati. –

+0

È vero che non ho cambiato questo codice da molto tempo. Dovrei affrontare davvero tutti questi problemi. – Lloyd

14

Per fare questo in fase di esecuzione ...

È possibile valutare IntPtr.Size. Se IntPtr.Size == 4, allora è 32 bit (4 x 8). Se IntPtr.Dimensione == 8 allora è 64 bit (8 x 8)

+1

Sembra il runtime, non il tempo di progettazione. –

+0

whoops, mio ​​male. corretto :) –

+2

È ancora utile; se si desidera prendere decisioni basate su piattaforma in fase di runtime. – Najeeb

1

Stavo cercando le stesse informazioni e ho scoperto che da Windows 8.1 non c'è più un asterisco.

Si dispone di una colonna di dettagli del Task Manager denominata "Piattaforma". Il suo contenuto è "32 bit" o "64 bit".

Problemi correlati