Comment savoir quelle version du .NET Framework un exécutable doit exécuter?

J’ai un fichier exécutable et j’aimerais savoir quelles versions du framework .NET ce fichier doit être démarré.

Existe-t-il un moyen facile de trouver cette information quelque part?

(Jusqu’à présent, j’ai essayé ILDASM et DUMPBIN sans aucune chance.)

Je pense que la plus proche est de déterminer quelle version du CLR est requirejse. Vous pouvez le faire en utilisant ILDASM et en regardant le nœud “MANIFEST” ou Reflector et en regardant la vue de dissociation du nœud “Application.exe” en tant que IL. Dans les deux cas, un commentaire indique la version du CLR. Dans ILDASM, le commentaire est “// Metadata version” et dans Reflector, le commentaire est “Target Runtime Version”.

Voici des exemples pour une application .NET WinForms nommée WindowsFormsApplication1.exe:

ILDASM:

// Metadata version: v2.0.50727 .assembly extern mscorlib { .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4.. .ver 2:0:0:0 } .assembly extern System { .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4.. .ver 2:0:0:0 } 

Réflecteur:

 .module WindowsFormsApplication1.exe .subsystem 0x0002 // MVID: {CA3D2090-16C5-4899-953E-4736D6BC0FA8} // Target Runtime Version: v2.0.50727 

Vous pouvez également consulter la liste des assemblys référencés et rechercher la référence avec le numéro de version le plus élevé.

Encore une fois, en utilisant ILDASM en regardant les données du noeud “MANIFEST”:

 .assembly extern System.Drawing { .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) // .?_....: .ver 2:0:0:0 } .assembly extern System.Core { .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4.. .ver 3:5:0:0 } 

Et en utilisant Reflector, en regardant le dissemblable (toujours comme IL) pour chaque référence répertoriée:

 .assembly extern System.Core { .ver 3:5:0:0 .publickeytoken = (B7 7A 5C 56 19 34 E0 89) } 

En recherchant la référence avec les métadonnées de version les plus élevées, vous pouvez déterminer la version de Framework dont cette référence provient, ce qui indique que la même version de Framework doit être installée pour que l’application s’exécute. Cela étant dit, je ne considérerais pas cela comme fiable à 100%, mais je ne pense pas que cela changera de sitôt.

À l’aide du Bloc – notes , vieux de trois décennies, d’une taille de 200 Ko, outil préinstallé:

  • ouvrir l’application avec notepad appname.exe ,
  • rechercher le mot “framework”,
  • Répétez la dernière recherche avec F3 jusqu’à ce que .NET Framework,version=vX.Y apparaisse
  • si rien n’a été trouvé (versions inférieures à 3.0), recherchez v2. … encore 100 fois plus facile que d’installer des gigaoctets d’outils d’parsing de points net et de studios d’ordures.

Tout autre éditeur / visualiseur peut également ouvrir des fichiers binarys, comme Notepad ++ ou l’excellent listeur de texte / hex de totalCommander .

Une approche plus simplifiée consisterait à utiliser dotPeek et à voir ce qui apparaît dans l’arbre.

Voir le panneau des propriétés: entrer la description de l'image ici

Vous pouvez maintenant utiliser ILSpy pour examiner le cadre cible d’un assembly. Après avoir chargé l’assembly, cliquez sur la racine du nœud d’assemblage et vous pouvez trouver les informations sous la déclaration TargetFramework:

 [assembly: TargetFramework(".NETFramework,Version=v4.5", FrameworkDisplayName = ".NET Framework 4.5")] 

A partir du code, vous pouvez utiliser Assembly.ImageRuntimeVersion mais en regardant le fichier, la meilleure chose à faire serait d’utiliser le réflecteur et de voir quelle version de mscorlib est référencée.

Edit: Mieux encore, utilisez ildasm , ouvrez votre assembly, puis affichez le manifeste pour l’assembly. La première ligne du manifeste vous indiquera la version exacte du CLR pour lequel l’assembly a été créé.