Je veux déterminer si un assembly natif est conforme en tant que x64 ou x86 à partir d'une application de code managé ( C # ).
Je pense que cela doit être quelque part dans l'en-tête PE car le chargeur du système d'exploitation doit connaître ces informations, mais je ne les ai pas trouvées. Bien sûr, je préfère le faire en code managé, mais si nécessaire, je peux utiliser le C ++ natif.
Réponses:
Vous pouvez également utiliser DUMPBIN . Utilisez l' indicateur
/headers
ou/all
et son premier en-tête de fichier répertorié.64 bits
32 bits
`` trouver '' peut rendre la vie un peu plus facile:
la source
mspdb100.dll
:(mspdb100.dll
dans le dossier oùdumpbin.exe
se trouve.DUMPBIN
peut courir après cela. Pour moi, le EXE est à<Visual Studio Install folder>\VC\bin
et la DLL est à<Visual Studio Install folder>\Common7\IDE
.Il existe un moyen simple de le faire avec CorFlags . Ouvrez l'invite de commandes Visual Studio et tapez "corflags [votre assembly]". Vous obtiendrez quelque chose comme ça:
Vous regardez spécifiquement PE et 32BIT.
Tout processeur :
PE: PE32 32BIT
: 0
x86 :
PE: PE32 32BIT
: 1
x64:
PE: PE32 + 32BIT
: 0
la source
Cette astuce fonctionne et ne nécessite que le bloc-notes.
Ouvrez le fichier dll à l'aide d'un éditeur de texte (comme le Bloc-notes) et recherchez la première occurrence de la chaîne
PE
. Le caractère suivant définit si la dll est 32 ou 64 bits.32 bits:
64 bits:
la source
Le
Magic
champ duIMAGE_OPTIONAL_HEADER
(bien qu'il n'y ait rien de facultatif à propos de l'en-tête dans les images exécutables Windows (fichiers DLL / EXE)) vous indiquera l'architecture du PE.Voici un exemple de capture de l'architecture à partir d'un fichier.
Les deux seules constantes d'architecture pour le moment sont:
À votre santé
MISE À JOUR Cela fait un moment que j'ai publié cette réponse, mais je vois toujours qu'elle reçoit quelques votes positifs de temps en temps, alors j'ai pensé que cela valait la peine d'être mis à jour. J'ai écrit un moyen d'obtenir l'architecture d'une
Portable Executable
image, qui vérifie également si elle a été compilée commeAnyCPU
. Malheureusement, la réponse est en C ++, mais il ne devrait pas être trop difficile de porter en C # si vous avez quelques minutes pour rechercher les structuresWinNT.h
. Si les gens sont intéressés, j'écrirai un portage en C #, mais à moins que les gens ne le veuillent réellement, je ne passerai pas beaucoup de temps à le stresser.La fonction accepte un pointeur vers une image PE en mémoire (vous pouvez donc choisir votre poison sur la façon de l'obtenir; mappage de mémoire ou lecture du tout en mémoire ... peu importe).
la source
32BIT
drapeau dans le PE, je ne sais pas par-dessus ma tête.Pour un fichier DLL non géré, vous devez d'abord vérifier s'il s'agit d'un fichier DLL 16 bits (espérons que non). Vérifiez ensuite le
IMAGE\_FILE_HEADER.Machine
champ.Quelqu'un d'autre a déjà pris le temps de résoudre ce problème, alors je vais simplement répéter ici:
la source
Vous pouvez trouver un exemple d'implémentation C # ici pour la
IMAGE_FILE_HEADER
solutionla source
Les binaires 64 bits sont stockés au format PE32 +. Essayez de lire http://www.masm32.com/board/index.php?action=dlattach;topic=6687.0;id=3486
la source
Ouvrez la dll avec un éditeur hexadécimal, comme HxD
S'il y a un "dt" sur la 9ème ligne, c'est 64 bits.
S'il y a un "L." sur la 9ème ligne, c'est 32 bits.
la source
J'ai réécrit la solution c ++ en première réponse dans le script PowerShell. Script peut déterminer ces types de fichiers .exe et .dll:
cette solution présente certains avantages par rapport à corflags.exe et au chargement de l'assembly via Assembly.Load en C # - vous n'obtiendrez jamais BadImageFormatException ou un message sur un en-tête non valide.
exemple d'utilisation:
vous pouvez omettre le deuxième paramètre si vous n'avez pas besoin de voir les détails
la source
Une façon rapide et probablement sale de le faire est décrite ici: https://superuser.com/a/889267 . Vous ouvrez la DLL dans un éditeur et vérifiez les premiers caractères après la séquence "PE".
la source
Apparemment, vous pouvez le trouver dans l'en-tête de l'exécutable portable. L'utilitaire corflags.exe est capable de vous montrer s'il cible ou non x64. J'espère que cela vous aidera à trouver plus d'informations à ce sujet.
la source
>corflags libzmq.dll \n\n ... corflags : error CF008 : The specified file does not have a valid managed header