Vérifier si un fichier est un assemblage .NET

J’ai vu des méthodes pour vérifier si un PEFile est un assemblage .NET en examinant la structure binary .

Est-ce la méthode la plus rapide pour tester plusieurs fichiers? J’imagine qu’essayer de charger chaque fichier (par exemple via Assembly.ReflectionOnlyLoad ) peut être assez lent car il chargera des informations de type de fichier.

Remarque: je cherche un moyen de vérifier les fichiers par programmation.

Peut-être que cela aide

de http://www.grimes.nildram.co.uk/dotnet/vistaAndDotnet.htm

Ensuite, je vérifie s’il s’agit d’un assemblage .NET. Pour ce faire, je vérifie si le fichier contient l’en-tête CLR. Cet en-tête contient des informations importantes sur l’emplacement du code .NET dans le fichier et sur la version de la structure utilisée pour écrire ce code. L’emplacement de cet en-tête est indiqué dans la table Data Directory du fichier. Si l’élément de répertoire de données a une valeur zéro, le fichier n’est pas géré. S’il contient des valeurs non nulles, il s’agit d’un assemblage .NET.

Vous pouvez le tester vous-même à l’aide de l’utilitaire dumpbin avec le commutateur / headers. Cet utilitaire imprimera les différents en-têtes dans un fichier sur la ligne de commande. À la fin des valeurs d’en-tête facultatives, vous verrez une liste des répertoires de données (il y en aura toujours 16) et si le répertoire du descripteur COM a un emplacement différent de zéro, cela indique que le fichier est un assemblage .NET. Le contenu de l’en-tête CLR peut également être répertorié à l’aide du commutateur / clrheader (si le fichier n’est pas géré, aucune valeur ne sera affichée). XP teste l’en-tête CLR lorsqu’il exécute un fichier. Si l’en-tête CLR est présent, il initialise le runtime et transmet le point d’entrée de l’assembly au runtime, de sorte que le fichier s’exécute totalement dans le runtime.

Je suppose que la réponse de Stormenet n’est pas techniquement programmatique , je vais donc séparer ma réponse en une réponse.

Pour des performances optimales, rien ne vaut l’ouverture du ou des fichiers avec un StreamReader , la lecture des (n) premiers octets et la recherche des structures de données de signature de fichier .NET dans le stream d’octets.

À peu près de la même manière que vous vérifieriez que quelque chose est un exécutable DOS:

http://en.wikipedia.org/wiki/DOS_executable

Recherchez les octets d’entête “MZ”, qui sont également les initiales de Mark Zbikowski, l’un des développeurs de MS-DOS.

Dans le passé, j’ai utilisé AssemblyName.GetAssemblyName (), qui lève une exception s’il ne s’agit pas d’un assembly géré. Cependant, je n’ai jamais testé ses performances, je ne peux donc pas dire à quelle vitesse.

Le premier lien sera la méthode de vérification la plus rapide et la plus simple (celle du fichier d’en-tête PE). Vous avez raison de supposer que l’appel de Assembly.ReflectionOnlyLoad va être assez lent.