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

StackOverflow https://stackoverflow.com/questions/325918

  •  11-07-2019
  •  | 
  •  

Question

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

Était-ce utile?

La solution

Je pense que le mieux que vous puissiez obtenir de manière fiable est de déterminer quelle version du CLR est requise. Vous pouvez le faire en utilisant ILDASM et en consultant le champ "MANIFEST". nœud ou réflecteur et en regardant la vue de désassemblage de " Application.exe " noeud comme IL. Dans les deux cas, un commentaire indique la version du CLR. Dans ILDASM, le commentaire est "// Version des métadonnées". et dans Reflector, le commentaire est "Version d'exécution cible".

Voici des exemples d'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, utilisez ILDASM en consultant l'option "MANIFEST". données de nœud:

.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 Reflector, en regardant la différence (toujours en 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 trouvant la référence avec les métadonnées de version les plus élevées, vous pouvez déterminer la version du Framework d'où provient la référence, ce qui indiquerait que vous avez besoin de la même version du Framework installée pour que l'application s'exécute. Cela dit, je ne considérerais pas cela comme fiable à 100%, mais je ne pense pas que cela changera de si tôt.

Autres conseils

Utilisation de Bloc-notes , vieux de trois décennies, d'une taille de 200 Ko, préinstallé:

  • application ouverte avec notepad appname.exe ,
  • rechercher le mot "cadre",
  • répétez la dernière recherche avec F3 jusqu'à ce que .NET Framework version = vX.Y soit affiché
  • si rien n'a été trouvé (versions inférieures à 3.0), recherchez v2. ... encore 100 fois plus facile que d'installer des giga-octets d'outils d'analyse de réseau par points et de garbage studios.

N'importe quel autre éditeur / visualiseur peut également ouvrir des fichiers binaires, comme Notepad ++ ou l'excellent visualiseur texte / hexagone de totalCommander lister .

Une approche plus simplifiée consisterait à utiliser dotPeek et à visualiser ce qui apparaît dans l'arborescence.

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

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")]

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

Modifier: Encore mieux, utilisez ildasm , ouvrez votre assembly, puis affichez le manifeste de l'assembly. La première ligne du manifeste indique la version exacte de CLR pour laquelle l’assemblage a été créé.

Vous pouvez utiliser un outil appelé CorFlags.exe. Il existe depuis .NET 2.0 et je sais avec certitude qu'il est inclus dans le Kit de développement logiciel (SDK) Windows 7.0. Par défaut (sous Windows XP Pro), il est installé sur C: \ Program Files \ Microsoft SDK \ Windows \ v7.0A \ bin \ CorFlags.exe. Fournissez-lui le chemin du fichier à un module géré (sans aucun autre indicateur de ligne de commande) pour afficher ses informations d'en-tête, y compris la version.

N'oubliez pas que cet utilitaire est conçu pour modifier l'en-tête PE32 d'un module. Par conséquent, n'utilisez aucun des indicateurs jusqu'à ce que vous lisiez le fichier documentation avec soin.

A partir de la ligne de commande: recherchez " Framework " MonApp.exe

Vous pouvez également rechercher la référence de System.Core dont il dispose. Cela vous indiquera la version .NET Framework utilisée par cette application. Pour 2.0, la version de System.Core sera 2.0.xxx.xxx. Pour la version 3.5, la version sera 3.5.xxx.xxx, etc.

Sous Linux / OSX / unix, vous pouvez utiliser:

strings that_app.exe | grep 'v2.\|Framework'
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top