Comment savoir si une DLL native fichier est compilé comme x64 ou x86?
Je veux déterminer si un natif de l'assemblée est respecté comme x64 ou x86 à partir d'une application de code managé (C#).
Je pense qu'il doit être quelque part dans l'en-tête PE depuis le chargeur du système d'exploitation a besoin de connaître cette information, mais je ne pouvais pas le trouver. Bien sûr, je préfère le faire en code managé, mais si nécessaire, je peux utiliser C++ natif.
- Pour être clair, la dll en question est également un .Net de l'assemblée? Vous dire que DLL native dans le titre du post, mais natif de l'assemblée dans la description... si vous êtes toujours activement à la recherche à ce poste à partir de 09 🙂
- Vous pourriez également vouloir vérifier celui-ci: check-if-unmanaged-dll-is-32-bit-or-64-bit.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser DUMPBIN trop. Utiliser le
/headers
ou/all
drapeau et son le premier en-tête de fichier listés.64 bits
32 bits
"trouver" peut rendre la vie un peu plus facile:
mspdb100.dll
🙁mspdb100.dll
dans le dossier oùdumpbin.exe
est situé.DUMPBIN
pouvez exécuter par la suite. Pour moi, l'EXE est à<Visual Studio Install folder>\VC\bin
et la DLL est au<Visual Studio Install folder>\Common7\IDE
.Il y a un moyen facile de le faire avec CorFlags. Ouvrez l'Invite de Commande Visual Studio et de type "corflags [votre assemblée]". Vous obtiendrez quelque chose comme ceci:
Vous êtes à la recherche au PE et 32 bits en particulier.
CPU:
PE: PE32
32 BITS: 0
x86:
PE: PE32
32 BITS: 1
x64:
PE: PE32+
32 BITS: 0
Ce astuce fonctionne et ne nécessite que le bloc-notes.
Ouvrir le fichier dll à l'aide d'un éditeur de texte (comme le bloc-notes) et de trouver 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
Magic
domaine de laIMAGE_OPTIONAL_HEADER
(même si il n'y a rien de facultatif sur l'en-tête dans un exécutable Windows images (DLL/EXE fichiers)) vous dites l'architecture de la PE.Voici un exemple d'accaparement de l'architecture à partir d'un fichier.
Les deux seules constantes de l'architecture à l'heure actuelle sont:
Acclamations
Mise à JOUR
Il a été un moment depuis que j'ai posté cette réponse, cependant je vois que ça devient un peu upvotes maintenant et à nouveau j'ai donc pensé qu'il valait la mise à jour. J'ai écrit un moyen d'obtenir de l'architecture d'un
Portable Executable
image, qui vérifie également s'il a été compilé en tant queAnyCPU
. Malheureusement, la réponse est en C++, mais il ne devrait pas être trop dur, du port, du C# si vous avez quelques minutes pour regarder les structuresWinNT.h
. Si des gens sont intéressés, je vais écrire un port en C#, mais si les gens ne le voulez vraiment j'ai l'habitude de passer beaucoup de temps de stresser à ce sujet.La fonction reçoit un pointeur vers une mémoire image PE (de sorte que vous pouvez choisir votre poison sur la façon de l'obtenir de leur mémoire;-de la cartographie ou de la lecture de toute la chose en mémoire...quoi que).
32BIT
drapeau de PE, je ne sais pas du haut de ma tête.Pour un non géré fichier DLL, vous devez d'abord vérifier si c'est une DLL 16 bits fichier (j'espère pas).
Ensuite, vérifiez le
IMAGE\_FILE_HEADER.Machine
champ.Quelqu'un d'autre pris le temps de faire ce travail déjà, donc je vais juste répéter ici:
Vous pouvez trouver un C# exemple de mise en œuvre ici pour la
IMAGE_FILE_HEADER
solutionFichiers binaires 64 bits sont stockés dans PE32+ format. Essayez de lire http://www.masm32.com/board/index.php?action=dlattach;rubrique=6687.0;id=3486
Ouvrir le fichier dll avec un éditeur hexadécimal, comme HxD
Si il y a une "dt" sur la ligne 9, il est en 64 bits.
Si il y a un "L." sur la ligne 9, il est de 32 bits.
J'ai réécrit c++ solution en première réponse dans un script powershell. Script peut déterminer ces types de .exe et .les fichiers dll:
cette solution présente certains avantages par rapport à corflags.exe et le chargement de l'assemblée par l'Assemblée.La charge en C# vous n'obtiendrez jamais BadImageFormatException ou message sur l'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
Un moyen rapide et probablement sale façon de le faire est décrit ici: https://superuser.com/a/889267. Vous ouvrez le fichier DLL dans un éditeur de texte et vérifiez les premiers caractères après le "PE" de la séquence.
Apparemment, vous pouvez le trouver dans l'en-tête du fichier exécutable portable. L'corflags.exe l'utilitaire est en mesure de vous montrer si oui ou non il vise x64. J'espère que cela vous aide à trouver plus d'informations à ce sujet.
>corflags libzmq.dll \n\n ... corflags : error CF008 : The specified file does not have a valid managed header