Perdona la estúpida pregunta, pero ¿qué te dice esto que es x86?
George Mauer
53
El campo ProcessorArchitecture es una enumeración; en el ejemplo anterior se establece en MSIL, que significa "Neutro con respecto al procesador y bits por palabra". Otros valores incluyen X86, IA64, Amd64. Ver msdn.microsoft.com/en-us/library/… para más detalles.
Brian Gillespie
44
Intente [reflection.assemblyname]::GetAssemblyName("${pwd}\name.dll")ya que a veces el directorio actual del proceso no es el mismo que el del proveedor actual (que es donde supongo que la DLL es para usted)
x0n
2
Otra advertencia a tener en cuenta es olvidarse de "desbloquear" la DLL si la descargó de Internet. Use unblock-file, o haga clic derecho / properties / unblock del explorador. Tendrá que reiniciar el shell para que reconozca el estado desbloqueado si ya ha fallado una vez en la sesión actual (culpe a Internet Explorer por eso, sí, realmente)
X0n
1
En el código ASP.NET MVC, hay un comentario // DevDiv 216459: This code originally used Assembly.GetName(), but that requires FileIOPermission, which isn't granted in medium trust. However, Assembly.FullName *is* accessible in medium trust.Lamentablemente, no hay forma de leer la Arquitectura del procesador sin usar el GetName instance method; utilizando AssemblyName constructor, el campo siempre se establece en None.
metadings
221
Puede usar la herramienta CorFlags CLI (por ejemplo, C: \ Archivos de programa \ Microsoft SDKs \ Windows \ v7.0 \ Bin \ CorFlags.exe) para determinar el estado de un ensamblaje, en función de su salida y abrir un ensamblaje como un El activo binario debe poder determinar dónde necesita buscar para determinar si el indicador de 32 bits está establecido en 1 ( x86 ) o 0 ( cualquier CPU o x64 , según PE):
Option| PE |32BIT----------|-------|---------
x86 | PE32 |1Any CPU | PE32 |0
x64 | PE32+|0
Aún mejor, puede usarModule.GetPEKind para determinar si un ensamblado tiene un PortableExecutableKindsvalor PE32Plus(64 bits), Required32Bit(32 bits y WOW) o ILOnly(cualquier CPU) junto con otros atributos.
Después de ver su actualización, usar GetPEKind parece ser la forma correcta de hacerlo. He marcado el tuyo como la respuesta.
Judá Gabriel Himango
99
GetPEKind falla en un proceso de 64 bits al verificar ensambles de 32 bits
jjxtra
2
Tienes que llamar a GetPEKind desde el proceso de 32 bits
Ludwo
2
Instalo VS 2008, VS 2010, VS 2012 y VS 2013. Tengo 8 archivos CorFlags.exe en subcarpetas en C: \ Archivos de programa (x86) \ Microsoft SDKs \ Windows \. ¿Cuál debería ser usado?
Kiquenet
55
Como se señaló en esta respuesta , en .NET 4.5 hay 32BITREQ y 32BITPREF en lugar del indicador 32BIT. PE32 / 0/0 y PE32 / 0/1 son AnyCPU y AnyCPU de 32 bits preferidos, respectivamente.
angularsen
141
Solo para aclarar, CorFlags.exe es parte del SDK de .NET Framework . Tengo las herramientas de desarrollo en mi máquina, y la forma más sencilla para determinar si una DLL es solo de 32 bits es:
Abra el símbolo del sistema de Visual Studio (en Windows: menú Inicio / Programas / Microsoft Visual Studio / Visual Studio Tools / Visual Studio 2008 Command Prompt)
CD al directorio que contiene la DLL en cuestión
Ejecute corflags como este:
corflags MyAssembly.dll
Obtendrá salida algo como esto:
Microsoft(R).NET FrameworkCorFlagsConversionTool.Version3.5.21022.8Copyright(c)MicrosoftCorporation.All rights reserved.Version: v2.0.50727
CLR Header:2.5
PE : PE32
CorFlags:3
ILONLY :132BIT:1Signed:0
Según los comentarios, las banderas anteriores deben leerse de la siguiente manera:
¿Qué tal si solo escribes el tuyo? El núcleo de la arquitectura PE no ha cambiado seriamente desde su implementación en Windows 95. Aquí hay un ejemplo de C #:
publicstaticushortGetPEArchitecture(string pFilePath){ushort architecture =0;try{using(System.IO.FileStream fStream =newSystem.IO.FileStream(pFilePath,System.IO.FileMode.Open,System.IO.FileAccess.Read)){using(System.IO.BinaryReader bReader =newSystem.IO.BinaryReader(fStream)){if(bReader.ReadUInt16()==23117)//check the MZ signature{
fStream.Seek(0x3A,System.IO.SeekOrigin.Current);//seek to e_lfanew.
fStream.Seek(bReader.ReadUInt32(),System.IO.SeekOrigin.Begin);//seek to the start of the NT header.if(bReader.ReadUInt32()==17744)//check the PE\0\0 signature.{
fStream.Seek(20,System.IO.SeekOrigin.Current);//seek past the file header,
architecture = bReader.ReadUInt16();//read the magic number of the optional header.}}}}}catch(Exception){/* TODO: Any exception handling you want to do, personally I just take 0 as a sign of failure */}//if architecture returns 0, there has been an error.return architecture;}}
Ahora las constantes actuales son:
0x10B- PE32 format.0x20B- PE32+ format.
Pero con este método permite las posibilidades de nuevas constantes, solo valide el retorno como mejor le parezca.
Interesante, gracias por el código con explicación. Module.GetPEKind es probablemente la ruta más fácil. Pero esto es útil para el aprendizaje. Gracias.
Judá Gabriel Himango
3
Muy interesante, pero cuando tengo una aplicación compilada con Any CPU, el resultado es 0x10B. Esto está mal porque mi aplicación se ejecuta en un sistema x64. ¿Hay alguna otra bandera para verificar?
Samuel
GetPEArchitecture funciona para ensamblados compilados usando .net 3.5, 4.0, 4.5 y 4.5.1. De todos modos, creo que Module.GetPEKind falla en un proceso de 64 bits al verificar ensambles de 32 bits.
Kiquenet
9
Intente utilizar CorFlagsReader de este proyecto en CodePlex . No tiene referencias a otros ensamblajes y se puede usar como está.
El enlace aún funciona a partir de este escrito, pero como CodePlex está a punto de cerrarse, sería bueno tomar las medidas adecuadas antes de que sea demasiado tarde.
Peter Mortensen
7
DotPeek de JetBrians proporciona una forma rápida y fácil de ver msil (anycpu), x86, x64
Gracias por esto, una de nuestras aplicaciones debe construirse como x86, agregar una prueba unitaria asegura que las bibliotecas de compilación del servidor de compilación serán de 32 bits y evita que ocurran esos errores :)
Mido
5
A continuación se muestra un archivo por lotes que se ejecutará corflags.exeen todos dllsy exesen el directorio de trabajo actual y todos los subdirectorios, analiza los resultados y muestra la arquitectura de destino de cada uno.
Dependiendo de la versión corflags.exeutilizada, las líneas de pedido en la salida incluirán 32BIT, o32BITREQ (y 32BITPREF). Cualquiera de estos dos está incluido en la salida es la línea de pedido crítica que debe verificarse para diferenciar entre Any CPUy x86. Si está utilizando una versión anterior de corflags.exe(anterior a Windows SDK v8.0A), solo la 32BITlínea de pedido estará presente en la salida, como lo han indicado otros en respuestas anteriores. De lo contrario 32BITREQ, y 32BITPREFreemplazarlo.
Esto supone que corflags.exeestá en el %PATH%. La forma más sencilla de garantizar esto es utilizar a Developer Command Prompt. Alternativamente, puede copiarlo desde su ubicación predeterminada .
Si el archivo por lotes siguiente se ejecuta contra un archivo no administrado dllo exe, lo mostrará incorrectamente como x86, ya que el resultado real de Corflags.exeserá un mensaje de error similar a:
corflags: error CF008: el archivo especificado no tiene un encabezado administrado válido
@echo off
echo.
echo Target architecture for all exes and dlls:
echo.
REM For each exe and dll inthis directory and all subdirectories...for%%a in(.exe,.dll)do forfiles /s /m *%%a /c "cmd /c echo @relpath"> testfiles.txt
for/f %%b in(testfiles.txt)do(
REM Dump corflags results to a text file
corflags /nologo %%b > corflagsdeets.txt
REM Parse the corflags results to look for key markers
findstr /C:"PE32+">nul .\corflagsdeets.txt &&(
REM `PE32+` indicates x64
echo %%~b = x64
)||(
REM pre-v8 Windows SDK listed only "32BIT" line item,
REM newer versions list "32BITREQ"and"32BITPREF" line items
findstr /C:"32BITREQ : 0">nul /C:"32BIT : 0".\corflagsdeets.txt &&(
REM `PE32`and NOT 32bit required indicates Any CPU
echo %%~b =Any CPU
)||(
REM `PE32`and32bit required indicates x86
echo %%~b = x86
))del corflagsdeets.txt
)del testfiles.txt
echo.
Una forma más sería usar dumpbin de las herramientas de Visual Studio en DLL y buscar la salida adecuada
dumpbin.exe /HEADERS <your dll path>
FILE HEADER VALUE
14C machine (x86)4 number of sections
5885AC36 time date stamp MonJan2312:39:4220170 file pointer to symbol table
0 number of symbols
E0 size of optional header
2102 characteristics
Executable32 bit word machine
DLL
Nota: Por encima de o / p es para 32 bits dll
Una opción más útil con dumpbin.exe es / EXPORTS, le mostrará la función expuesta por el dll
He clonado una herramienta súper práctica que agrega una entrada de menú contextual para ensamblajes en el explorador de Windows para mostrar toda la información disponible:
Otra forma de verificar la plataforma de destino de un ensamblado .NET es inspeccionar el ensamblaje con .NET Reflector ...
@ # ~ # € ~! ¡Me acabo de dar cuenta de que la nueva versión no es gratuita! Entonces, corrección, si tiene una versión gratuita del reflector .NET, puede usarla para verificar la plataforma de destino.
C:\Downloads\ApiChange>ApiChange.exe -CorFlags c:\Windows\winhlp32.exe
FileName;Type;Size;Processor; IL Only;Signed
winhlp32.exe;Unmanaged;296960; X86
C:\Downloads\ApiChange>ApiChange.exe -CorFlags c:\Windows\HelpPane.exe
FileName;Type;Size;Processor; IL Only;SignedHelpPane.exe;Unmanaged;733696;Amd64
Una alternativa a las herramientas ya mencionadas es Telerik JustDecompile (herramienta gratuita) que mostrará la información junto al nombre del ensamblado:
Respuestas:
Mirar
System.Reflection.AssemblyName.GetAssemblyName(string assemblyFile)
Puede examinar los metadatos de ensamblaje desde la instancia de AssemblyName devuelta:
Usando PowerShell :
Aquí, ProcessorArchitecture identifica la plataforma objetivo.
Estoy usando PowerShell en este ejemplo para llamar al método.
fuente
[reflection.assemblyname]::GetAssemblyName("${pwd}\name.dll")
ya que a veces el directorio actual del proceso no es el mismo que el del proveedor actual (que es donde supongo que la DLL es para usted)// DevDiv 216459: This code originally used Assembly.GetName(), but that requires FileIOPermission, which isn't granted in medium trust. However, Assembly.FullName *is* accessible in medium trust.
Lamentablemente, no hay forma de leer la Arquitectura del procesador sin usar elGetName instance method
; utilizandoAssemblyName constructor
, el campo siempre se establece enNone
.Puede usar la herramienta CorFlags CLI (por ejemplo, C: \ Archivos de programa \ Microsoft SDKs \ Windows \ v7.0 \ Bin \ CorFlags.exe) para determinar el estado de un ensamblaje, en función de su salida y abrir un ensamblaje como un El activo binario debe poder determinar dónde necesita buscar para determinar si el indicador de 32 bits está establecido en 1 ( x86 ) o 0 ( cualquier CPU o x64 , según
PE
):La publicación de blog x64 Desarrollo con .NET tiene información sobre
corflags
.Aún mejor, puede usar
Module.GetPEKind
para determinar si un ensamblado tiene unPortableExecutableKinds
valorPE32Plus
(64 bits),Required32Bit
(32 bits y WOW) oILOnly
(cualquier CPU) junto con otros atributos.fuente
Solo para aclarar, CorFlags.exe es parte del SDK de .NET Framework . Tengo las herramientas de desarrollo en mi máquina, y la forma más sencilla para determinar si una DLL es solo de 32 bits es:
Abra el símbolo del sistema de Visual Studio (en Windows: menú Inicio / Programas / Microsoft Visual Studio / Visual Studio Tools / Visual Studio 2008 Command Prompt)
CD al directorio que contiene la DLL en cuestión
Ejecute corflags como este:
corflags MyAssembly.dll
Obtendrá salida algo como esto:
Según los comentarios, las banderas anteriores deben leerse de la siguiente manera:
fuente
32BITREQ
y32BITPREF
no un solo32BIT
valor.¿Qué tal si solo escribes el tuyo? El núcleo de la arquitectura PE no ha cambiado seriamente desde su implementación en Windows 95. Aquí hay un ejemplo de C #:
Ahora las constantes actuales son:
Pero con este método permite las posibilidades de nuevas constantes, solo valide el retorno como mejor le parezca.
fuente
Intente utilizar CorFlagsReader de este proyecto en CodePlex . No tiene referencias a otros ensamblajes y se puede usar como está.
fuente
DotPeek de JetBrians proporciona una forma rápida y fácil de ver msil (anycpu), x86, x64
fuente
fuente
A continuación se muestra un archivo por lotes que se ejecutará
corflags.exe
en todosdlls
yexes
en el directorio de trabajo actual y todos los subdirectorios, analiza los resultados y muestra la arquitectura de destino de cada uno.Dependiendo de la versión
corflags.exe
utilizada, las líneas de pedido en la salida incluirán32BIT
, o32BITREQ
(y32BITPREF
). Cualquiera de estos dos está incluido en la salida es la línea de pedido crítica que debe verificarse para diferenciar entreAny CPU
yx86
. Si está utilizando una versión anterior decorflags.exe
(anterior a Windows SDK v8.0A), solo la32BIT
línea de pedido estará presente en la salida, como lo han indicado otros en respuestas anteriores. De lo contrario32BITREQ
, y32BITPREF
reemplazarlo.Esto supone que
corflags.exe
está en el%PATH%
. La forma más sencilla de garantizar esto es utilizar aDeveloper Command Prompt
. Alternativamente, puede copiarlo desde su ubicación predeterminada .Si el archivo por lotes siguiente se ejecuta contra un archivo no administrado
dll
oexe
, lo mostrará incorrectamente comox86
, ya que el resultado real deCorflags.exe
será un mensaje de error similar a:fuente
Una forma más sería usar dumpbin de las herramientas de Visual Studio en DLL y buscar la salida adecuada
Nota: Por encima de o / p es para 32 bits dll
Una opción más útil con dumpbin.exe es / EXPORTS, le mostrará la función expuesta por el dll
fuente
De forma más genérica: use la estructura de archivos para determinar el tipo de imagen y el bitness:
Enumeración del modo de compilación
Código fuente con explicación en GitHub
fuente
He clonado una herramienta súper práctica que agrega una entrada de menú contextual para ensamblajes en el explorador de Windows para mostrar toda la información disponible:
Descargue aquí: https://github.com/tebjan/AssemblyInformation/releases
fuente
Otra forma de verificar la plataforma de destino de un ensamblado .NET es inspeccionar el ensamblaje con .NET Reflector ...
@ # ~ # € ~! ¡Me acabo de dar cuenta de que la nueva versión no es gratuita! Entonces, corrección, si tiene una versión gratuita del reflector .NET, puede usarla para verificar la plataforma de destino.
fuente
cfeduke señala la posibilidad de llamar a GetPEKind. Es potencialmente interesante hacer esto desde PowerShell.
Aquí, por ejemplo, hay un código para un cmdlet que podría usarse: https://stackoverflow.com/a/16181743/64257
Alternativamente, en https://stackoverflow.com/a/4719567/64257 se observa que "también está el cmdlet Get-PEHeader en las Extensiones de comunidad de PowerShell que se puede usar para probar imágenes ejecutables".
fuente
Puede encontrar una aplicación más avanzada para eso aquí: CodePlex - ApiChange
Ejemplos:
fuente
Una alternativa a las herramientas ya mencionadas es Telerik JustDecompile (herramienta gratuita) que mostrará la información junto al nombre del ensamblado:
fuente