2012-02-27 10 views
7

Necesito determinar mediante programación si un ensamblado es x86, x64 o AnyCPU? Hay una casi idéntica question, pero la solución que proporciona¿Cómo verificar programáticamente si un ensamblado administrado es x86, x64 o AnyCPU?

Assembly assembly = Assembly.LoadFrom(fileName); 
PortableExecutableKinds peKind; 
ImageFileMachine imageFileMachine; 
assembly.ManifestModule.GetPEKind(out peKind, out imageFileMachine); 

falla al intentar cargar un conjunto de 64 bits a partir de un proceso de 32 bits (y viceversa).

¿Existe una forma infalible de encontrar programáticamente el tipo de compilación de un ensamblaje?

EDITAR: Basado en la sugerencia de @BenVoigt, creé un small command line utility que comprueba si la DLL se gestiona o no y si es x86/x64/AnyCPU. Espero que alguien lo encuentre útil.

+2

¿Has probado ['ReflectionOnlyLoadFrom'] (http://msdn.microsoft.com/en-us/library/system.reflection.assembly.reflectiononlyloadfrom.aspx)? –

+0

@BenVoigt Es muy probable que sea una respuesta, no un comentario :) – dasblinkenlight

+0

@BenVoigt Lo hice ahora y tiene toda la razón. Conviértalo en la respuesta y lo aceptaré. – AngryHacker

Respuesta

14

Esta cuestión ha sido ya cubierto:

Pero las respuestas son incompletas, lo que sugiere el uso de Assembly.LoadFrom. Esa es una idea terrible, ya que ejecutará el código del ensamblado, además de fallar si el bitness no coincide con su proceso.

En su lugar, debe usar Assembly.ReflectionOnlyLoadFrom. Esto le permite leer los metadatos sin cargar realmente ningún código y, por lo tanto, no es necesario que la arquitectura sea correcta.

Cuestiones relacionadas