Quiero determinar si un ensamblado nativo se cumple como x64 o x86 desde una aplicación de código administrado ( C # ).
Creo que debe estar en algún lugar del encabezado PE ya que el cargador del sistema operativo necesita conocer esta información, pero no pude encontrarla. Por supuesto, prefiero hacerlo en código administrado, pero si es necesario, puedo usar C ++ nativo.
Respuestas:
También puedes usar DUMPBIN . Use el indicador
/headers
o/all
y es el primer encabezado de archivo de la lista.64 bits
32 bits
'find' puede hacer la vida un poco más fácil:
fuente
mspdb100.dll
:(mspdb100.dll
en la carpeta dondedumpbin.exe
se encuentra.DUMPBIN
puede correr después de eso. Para mí, el EXE está en<Visual Studio Install folder>\VC\bin
y la DLL está en<Visual Studio Install folder>\Common7\IDE
.Hay una manera fácil de hacer esto con CorFlags . Abra el símbolo del sistema de Visual Studio y escriba "corflags [su ensamblaje]". Obtendrás algo como esto:
Estás viendo PE y 32BIT específicamente.
Cualquier CPU :
PE: PE32
32BIT: 0
x86 :
PE: PE32
32BIT: 1
x64:
PE: PE32 +
32BIT: 0
fuente
Este truco funciona y solo requiere el Bloc de notas.
Abra el archivo dll usando un editor de texto (como el Bloc de notas) y encuentre la primera aparición de la cadena
PE
. El siguiente carácter define si el dll es de 32 o 64 bits.32 bits:
64 bits:
fuente
El
Magic
campo deIMAGE_OPTIONAL_HEADER
(aunque no hay nada opcional sobre el encabezado en las imágenes ejecutables de Windows (archivos DLL / EXE)) le indicará la arquitectura del PE.Aquí hay un ejemplo de cómo tomar la arquitectura de un archivo.
Las únicas dos constantes de arquitectura en este momento son:
Salud
ACTUALIZACIÓN Ha pasado un tiempo desde que publiqué esta respuesta, pero aún veo que recibe algunos votos positivos de vez en cuando, así que pensé que valía la pena actualizarla. Escribí una forma de obtener la arquitectura de una
Portable Executable
imagen, que también verifica si se compiló comoAnyCPU
. Desafortunadamente, la respuesta está en C ++, pero no debería ser demasiado difícil de transferir a C # si tiene unos minutos para buscar las estructurasWinNT.h
. Si la gente está interesada, escribiré un puerto en C #, pero a menos que la gente realmente lo quiera, no pasaré mucho tiempo estresándolo.La función acepta un puntero a una imagen PE en memoria (para que pueda elegir su veneno sobre cómo obtenerla; mapeo de memoria o leer todo en la memoria ... lo que sea).
fuente
32BIT
bandera en el PE, no lo sé.Para un archivo DLL no administrado, primero debe verificar si es un archivo DLL de 16 bits (con suerte no). Luego verifique el
IMAGE\_FILE_HEADER.Machine
campo.Alguien más se tomó el tiempo para resolver esto, así que solo repetiré aquí:
fuente
Puede encontrar una implementación de muestra de C # aquí para la
IMAGE_FILE_HEADER
soluciónfuente
Los binarios de 64 bits se almacenan en formato PE32 +. Intente leer http://www.masm32.com/board/index.php?action=dlattach;topic=6687.0;id=3486
fuente
Abra el dll con un editor hexadecimal, como HxD
Si hay un "dt" en la novena línea, es de 64 bits.
Si hay una "L" en la novena línea es de 32 bits.
fuente
Reescribí la solución de C ++ en la primera respuesta en el script de PowerShell. El script puede determinar este tipo de archivos .exe y .dll:
esta solución tiene algunas ventajas sobre corflags.exe y la carga del ensamblaje a través de Assembly.Load en C #: nunca obtendrá BadImageFormatException o un mensaje sobre un encabezado no válido.
ejemplo de uso:
puede omitir el segundo parámetro si no necesita ver detalles
fuente
Aquí se describe una forma rápida y probablemente sucia de hacerlo: https://superuser.com/a/889267 . Abre la DLL en un editor y verifica los primeros caracteres después de la secuencia "PE".
fuente
Aparentemente puedes encontrarlo en el encabezado del ejecutable portátil. La utilidad corflags.exe puede mostrarle si se dirige o no a x64. Esperemos que esto te ayude a encontrar más información al respecto.
fuente
>corflags libzmq.dll \n\n ... corflags : error CF008 : The specified file does not have a valid managed header