101 votes

Comment savoir quelle version du .NET Framework un exécutable doit être exécuté?

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.)

55voto

Scott Dorman Points 25000

Je pense que le plus proche que vous pouvez obtenir de manière fiable est de déterminer quelle est la version de la CLR est nécessaire. Vous pouvez le faire en utilisant ILDASM et en regardant le "MANIFESTE" nœud ou un Réflecteur et en regardant la dissasembly vue de l' "Application.exe" le noeud que l'IL. Dans les deux cas, il y a un commentaire qui indique la version CLR. Dans ILDASM, le commentaire est "// Métadonnées version" et dans le Réflecteur, le commentaire est "Target Runtime Version".

Voici des exemples pour une .NET WinForms application 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 recherchez la référence avec le plus haut numéro de version.

Encore une fois, à l'aide de ILDASM en regardant le "MANIFESTE" nœud de données:

.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 à l'aide de Réflecteur, en regardant les dissambly (encore qu'IL) pour chaque référence répertoriés:

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

Par trouver la référence avec la version la plus récente des métadonnées, vous pouvez déterminer quelle version du Cadre de référence est venu, ce qui pourrait indiquer que vous avez besoin de la version du Framework installé pour l'exécution de l'application. Cela étant dit, je ne voudrais pas traiter cela comme fiable à 100%, mais je ne pense pas que cela va changer bientôt.

33voto

Daniel A. White Points 91889

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

25voto

tsandhol Points 116

Vous pouvez maintenant utiliser ILSpy pour examiner la structure cible d'un assemblage. Après avoir chargé l'assembly, cliquez sur la racine du nœud d'assemblage. Vous trouverez les informations dans la déclaration TargetFramework:

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

15voto

Andrew Hare Points 159332

De code que vous pouvez utiliser Assembly.ImageRuntimeVersion mais en regardant le fichier probablement la meilleure chose à faire serait d'utiliser un réflecteur et de voir quelle est la version de mscorlib est référencé.

Edit: Encore mieux serait d'utiliser ildasm, ouvrez votre assemblée, puis afficher le manifeste pour l'assemblée. La première ligne de la volonté manifeste de vous dire l' exacte version du CLR que l'assemblée a été construit pour les.

11voto

Vince Fedorchak Points 270

Vous pouvez utiliser un outil appelé CorFlags.exe. Il a été autour depuis .NET 2.0, et je sais pour sûr qu'il est inclus dans le SDK de Windows 7.0. Par défaut (Windows XP Pro), il est installé à C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin\CorFlags.exe. De lui fournir le chemin d'accès du fichier de gestion de module (sans autres options de ligne de commande) pour afficher les informations d'en-tête, qui comprend la version.

Gardez à l'esprit que cet utilitaire est conçu pour modifier le PE32 en-tête du module, afin de ne pas utiliser les drapeaux jusqu'à ce que vous lisez la documentation soigneusement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X