2010-09-23 12 views
39

Tengo una aplicación .NET que se suponía que debía compilarse como una aplicación de solo 32 bits. Sospecho que mi servidor de compilación no lo está haciendo realmente.¿Cómo puedo determinar si una aplicación .NET tiene 32 o 64 bits?

¿Cómo puedo determinar si una aplicación .NET está realmente configurada para ejecutarse en modo de 32 bits?

+0

No está claro lo que está preguntando: ¿tiene un dll que desea verificar o una aplicación que desea verificar? –

+0

@jaco - no debería importar. Un exe también es un ensamblado. Su punto principal es que debe hacerse externamente ya que el programa resultante es el resultado de un servidor de compilación. – x0n

+0

Cierto, pero estoy tratando de descubrir qué está mirando. Pero tienes razón, no debería importar. –

Respuesta

41

Si usted está tratando de comprobar si una aplicación en ejecución se ejecuta en 32 bits o de 64 bits modo, abra el administrador de tareas y verifique si tiene un asterisco (* 32) al lado del nombre del proceso.

Si usted tiene un archivo DLL compilado y desea comprobar si está compilado para el modo de 32 bits o de 64 bits, haga lo siguiente (de una related question). Creo que quieres que compilas tu dll para AnyCPU.

Abra Visual Studio Command Prompt y escriba "corflags [su conjunto]". Usted obtendrá algo como esto:

 
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 

Se encuentra en el PE y 32BIT específicamente.

Cualquier CPU:

PE: PE32 32BIT: 0

x86:

PE: PE32 32BIT: 1

x64:

PE: PE32 + 32BIT: 0

+1

Gracias, eso es exactamente lo que quería. (Aunque su respuesta también me molesta un poco porque sabía que CorFlags podría cambiar la configuración, pero nada en los documentos me dice que también puede leerlo). –

6

Bueno, si está utilizando .NET 4.0, hay System.Environment.Is64BitProcess.

+1

No creo que esto esté respondiendo la pregunta del OP. –

+0

¿No hay alguna bandera en el conjunto que diga si JIT en 32, 64 o cualquiera? –

+0

@Will A: ¿No pudo el OP poner ese código en su aplicación y hacer que muestre un mensaje en loadup (o algo así)? Es una pregunta sincera: realmente pensé que esto era lo que él quería. Ahora que veo algunas de las otras respuestas, me doy cuenta de que quizás él quería algo fuera del proceso en sí. –

7

La forma más rápida es probablemente tener un asterisco (*) después de su nombre en el administrador de tareas cuando se ejecuta en una máquina de 64 bits. El asterisco significa que se está ejecutando en syswow64, ergo está marcado 32 bit.

La otra forma es ejecutar corflags.exe contra ella y esto mostrará la respuesta que está buscando. Esto viene con .NET SDK.

+0

De acuerdo, el administrador de tareas es * siempre * preciso. Corflags solo muestra intenciones. –

2

Si desea probar un montaje no mediante programación, puede utilizar corflags.exe

>corflags.exe <assembly> 

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

utilizo el siguiente código:

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

Puede pasar Process.CurrentProcess o similar a este.

+0

Esto tiene algunos defectos, en su mayoría relacionados con el manejo de excepción: el "catch-all" "y todo" también captará cosas como OutOfMemoryException, ThreadAbortException, AccessViolationException, etc. todo lo que señala un mal estado de la CLR y no tiene nada que ver con el proceso en cuestión que no es un proceso de 32 bits en el sistema de 64 bits (WOW64)) Luego, la propiedad "Manejar" arroja una excepción si se solicita un proceso sin permiso o que ya se ha ido, aún podría ser un proceso de 32 bits. Finalmente, si IntPtr.Size es 64, el proceso es de 64 bits; no es necesario que los demás elementos lo comprueben. –

+0

Es cierto, no he cambiado este código en mucho tiempo. Debo abordar todos esos problemas realmente. – Lloyd

14

Para hacer esto en tiempo de ejecución ...

Puede evaluar IntPtr.Size. Si IntPtr.Size == 4 entonces es 32 bit (4 x 8). Si IntPtr.Tamaño == 8 luego es 64 bit (8 x 8)

+1

Eso suena como tiempo de ejecución, no como tiempo de diseño. –

+0

whoops, mi mal. corregido :) –

+2

Todavía es útil; si desea tomar decisiones basadas en plataforma en tiempo de ejecución. – Najeeb

1

Estaba buscando la misma información y descubrí que desde Windows 8.1 no hay más asterisco.

Tiene una columna de detalles del Administrador de tareas llamada "Plataforma". Su contenido es "32 bits" o "64 bits".

Cuestiones relacionadas