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

97

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 ces informations quelque part?

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

Sam
la source
Voir aussi stackoverflow.com/questions/3460982/…
Ruben Bartelink
docs.microsoft.com/en-us/sysinternals/downloads - Process Explorer fait cela très bien et facile à utiliser, il suffit de l'exécuter en tant qu'administrateur
AquaAlex

Réponses:

55

Je pense que le plus proche que vous pouvez obtenir de manière fiable est de déterminer quelle version du CLR est requise. Vous pouvez le faire en utilisant ILDASM et en regardant le nœud "MANIFEST" ou Reflector et en regardant la vue de désassemblage du nœud "Application.exe" comme IL. Dans les deux cas, un commentaire indique la version 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 pour une application .NET WinForms nommée WindowsFormsApplication1.exe:

ILDASME:

// 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 nœud "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 dissambly (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 de quelle version du Framework cette référence provient, ce qui indiquerait que vous avez besoin de la même version du Framework installée pour que l'application s'exécute. Cela étant dit, je ne traiterais pas cela comme 100% fiable, mais je ne pense pas que cela changera de si tôt.

Scott Dorman
la source
4
Malheureusement, Microsoft introduit un changement radical pour la technique ci-dessus. Les assemblys .NET 4.5 ne peuvent pas s'exécuter sur .NET 4 brut et pour indiquer à un assembly .NET 4.5, vous devez également lire System.Runtime.Versioning.TargetFrameworkAttribute. lextm.com/2013/02/how-to-tell-net-45-only-assemblies.html
Lex Li
56

Utilisation du Bloc - notes , vieux de trois décennies, 200 Ko, outil préinstallé:

  • application ouverte avec notepad appname.exe,
  • rechercher le mot "framework",
  • répéter la dernière recherche avec F3jusqu'à ce que .NET Framework,version=vX.Ys'affiche
  • si rien n'a été trouvé (versions inférieures à 3.0) recherchez v2.... toujours 100 fois plus facile que d'installer des gigaoctets d'outils d'analyse de réseau de points et de garbage studios.

Tout autre éditeur / visualiseur peut également ouvrir des binaires, comme Notepad ++ ou le grand visualiseur texte / hexadécimal de totalCommander .

Asain Kujovic
la source
C'est génial - surtout si vous n'avez pas accès à des outils de décompilation / autres
Craig
@BentTranberg intéressant, pouvez-vous m'envoyer exe d'une manière ou d'une autre, asainnp à gmail com.
Asain Kujovic
32

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

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

Daniel A. White
la source
22

Vous pouvez maintenant utiliser ILSpy pour examiner la structure cible d'un assembly. Après avoir chargé l'assemblage, 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")]
Tsandhol
la source
2
Notez que TargetFrameworkAttribute n'a été ajouté que dans .NET 4.0 et ne sera donc pas présent sur les assemblys compilés avec .NET 3.5 ou version antérieure.
Wai Ha Lee
ILSpy affiche «Runtime: vXXX» dans les commentaires lorsque vous cliquez sur le nœud racine de l'assemblage chargé. J'ai pu voir un projet de cadre v1.1.4322.
ryancdotnet
15

À partir du code que vous pouvez utiliser, Assembly.ImageRuntimeVersionmais en regardant le fichier, la meilleure chose à faire serait probablement d'utiliser Reflector et de voir quelle version de mscorlibest référencée.

Edit: Mieux vaut encore utiliser ildasm , ouvrir votre assembly, puis afficher le manifeste de l'assembly. La première ligne du manifeste vous indiquera la version exacte de CLR pour laquelle l'assembly a été créé.

Andrew Hare
la source
3
C'est faux. L'OP a posé des questions sur la version de .NET Framework et non sur la version du CLR Runtime. Cette réponse concerne ce dernier. À titre d'exemple, je cours avec Framework 4.7.2531.0 qui utilise la version 4.0.30139 du CLR Runtime. ImageRuntimeVersion renvoie la version CLR, pas la version Framework.
Tom Baxter
11

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 SDK Windows 7.0. Par défaut (sous Windows XP Pro), il est installé dans C: \ Program Files \ Microsoft SDKs \ Windows \ v7.0A \ bin \ CorFlags.exe. Fournissez-lui le chemin du fichier vers un module géré (sans aucun autre indicateur de ligne de commande) pour afficher ses informations d'en-tête, qui incluent la version.

Gardez à l'esprit que cet utilitaire est conçu pour modifier l'en-tête PE32 d'un module, n'utilisez donc aucun des indicateurs avant d'avoir lu attentivement la documentation .

Vince Fedorchak
la source
2
Impossible de faire la distinction entre .Net4 et .Net4.5
mheyman
11

Depuis la ligne de commande: find "Framework" MyApp.exe

Sean B
la source
2

Ou vous pouvez simplement découvrir quelle référence de System.Core il a. Cela vous indiquera la version .NET Framework que cette application utilise. 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.

Denis
la source
Je ne pense pas que ce soit vrai. J'ai un framework cible de 4.5 mais j'utilise System.Core 4.0.XXX.XXX
Paul Totzke
2

Vous pouvez obtenir la version .NET d'un fichier sous Windows à l'aide de Powershell. Le script suivant;

$path=’.\’
$ErrorActionPreference = "SilentlyContinue"
$files=Get-ChildItem -Path $path -Recurse -include *.dll,*.exe
foreach($file in $files)
{
    $filename = $file.BaseName
    $version = $([System.Reflection.Assembly]::ReflectionOnlyLoadFrom($file.FullName).GetCustomAttributesData() |
                 select-object -ExpandProperty ConstructorArguments | 
                 select-object -ExpandProperty Value | 
                 select-string -Pattern '.NET')
    Write-Output "$filename,$version"
}

fournit le résultat suivant; entrez la description de l'image ici

Notez que le résultat a extrait la version .NET pour les fichiers exe dans ce dossier, mais il fera également de même pour une dll.

Mark Walker
la source
1

Sous Linux / OSX / unix, vous pouvez utiliser:

strings that_app.exe | grep 'v2.\|Framework'
Pierz
la source