2009-12-22 15 views

Répondre

5

Exécutez l'outil PEVerify contre votre assemblée. PEVerify.exe est installé avec Visual Studio, par exemple,

celui-ci est livré avec Visual Studio 2012:

C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\PEVerify.exe

+0

Une fois que vous exécutez cet utilitaire, comment peut-on dire si c'est du code purement géré? Je viens d'obtenir: "Toutes les classes et méthodes dans Vérifié." –

+1

@DanW: alors tout va bien. Vous aurez des erreurs sinon. Si invoqué à partir d'un script ou d'un autre programme, vous pouvez rechercher un code de sortie différent de zéro qui indique des erreurs. Vous pouvez tester cela en utilisant le mot clé "dangereux" en C#. –

0

Je vais devoir vérifier ceci mais je suis sûr que vous pouvez trouver cela avec Reflector by redgate.

+1

ne semble pas être une bonne idée - il y a beaucoup de travail à creuser toutes les méthodes d'un assemblage – ironic

+0

Comment je ne peux pas trouver quelque chose dans Reflector 5.1.6.0 à ce sujet –

0

ILMerge ne, fusionne gérés here, assemblées à citer leur page de téléchargement, 'ILMerge est un utilitaire pour fusionner plusieurs ensembles .NET en un seul assemblage .NET.

Je n'ai pas vu un assembly géré fusionné avec un binaire natif. Techniquement, vous pourriez les faire fusionner en soi, en incluant le binaire non managé comme une ressource incorporée, mais le chargement de la ressource incorporée dans la mémoire comme un code binaire - je n'ai jamais vu cela auparavant. J'ai essayé cette technique en utilisant des cartes mémoire mais j'ai échoué.

L'autre façon de vérifier est de regarder dans le binaire lui-même, s'il a la 15ème entrée dans le répertoire de données, et est non nul alors c'est un binaire .NET, les binaires natifs ne l'ont pas. Voir here où j'ai posté cette réponse à une question similaire.

Espérons que cela aide, Cordialement, Tom.

0

Je pense que vous devriez utiliser la réflexion .NET pour passer en revue tous les types et toutes les méthodes d'assemblage.

3

Exécuter ildasm à partir d'une invite de commande Visual Studio comme suit:

ildasm file.exe/têtes/noil/texte

Vers la fin de la sortie, vous verrez les éléments suivants:

// ----- CLR tête:
taille // En-tête: ...
// Major exécution versi sur: ...
// version d'exécution mineure: ...
// ...
// Drapeaux: 0x00000000

Si Flags a le bit le plus bas (par exemple 0x00000001) alors l'assemblage est pur CLR; si ce n'est pas le cas (par exemple 0x00000000), l'assemblage est en mode mixte. Notez que d'autres drapeaux peuvent être présents, donc c'est seulement le bit le plus bas qui vous intéresse (donc si le dernier chiffre est 1, 3, 5, 7, 9, b, d ou f alors c'est CLR pur).

(Edit: Vous pouvez également exécuter ildasm graphique, ouvrez le fichier exécutable en question et choisissez en-têtes dans le menu Affichage pour voir les mêmes informations.)

+3

Pas un slik-dunk afaik, le compil C++/CLI er/linker ne définit pas ce bit correctement, même si vous compilez avec/clr: pure. Corflags.exe le montre aussi. –

9

Comme le suggère nobugz, d'une façon plus facile de voir les drapeaux CLR utilise l'utilitaire corflags, qui fait partie du SDK .NET 2.0.

Si aucune option sont spécifiées, les drapeaux pour l'image donnée sont affichés:

C:\>corflags Foo.dll 
Version : v2.0.50727 
CLR Header: 2.5 
PE  : PE32 
CorFlags : 9 
ILONLY : 1 
32BIT  : 0 
Signed : 1 

Le bit « ILONLY » indique si c'est un pur assemby géré ou un assemblage mixte.

Notez que le commentaire de l'utilisateur 'nobugz' suggère que ces indicateurs ne sont pas garantis être corrects, donc cette méthode peut ne pas être infaillible.

0

Pour obtenir les drapeaux PE de C#, utilisez l'API System.Reflection: http://www.example8.com/category/view/id/6027

...

Assembly a = Assembly.GetExecutingAssembly(); 
Module m = a.ManifestModule; 

PortableExecutableKinds peKinds; 
ImageFileMachine imageFileMachine; 
m.GetPEKind(out peKinds, out imageFileMachine); 

if ((peKinds & PortableExecutableKinds.ILOnly) != 0) 

...

1

Amélioration de la réponse fournie ci-dessus Wim ..

  1. Localisez votre "PEVerify.exe" - vous l'avez si vous avez VS installé.- CO PY LE CHEMIN COMPLET DU fichier PEVerify.exe, votre chemin sera différent - - Voici un exemple: C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v8.0A \ bin \ NETFX 4.0 Outils \ PEVerify.exe

  2. Ouvrez l'invite Visual studio commande (ne pas "Exécuter en tant qu'administrateur")

  3. Tapez: cd C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools

  4. votre invite de commande devrait maintenant être ce long texte au lieu de simplement C: \ ou quelque chose .... il pointera vers le chemin d'où PEVerify.exe est situé.

  5. Maintenant, tapez: peverify "your full path to your dll you want to check - puis appuyez sur Entrée - Voici mon exemple: PEVerify "G: \ TestFolder \ My_Managed_OR_Unmanaged.dll"

  6. Une fois que vous appuyez sur Entrée et vous obtenez un message comme ci-dessous, son 100 % dll géré -. toutes les classes et méthodes dans My_Managed_OR_Unmanaged.dll Vérifié »