Déterminer la version .NET Framework pour dll

137

J'ai une ancienne DLL qui a été compilée avec le framework .NET et déployée. Je ne sais pas avec quelle version du framework .NET il a été compilé. Je me demande comment je peux déterminer avec quelle version du framework .NET cette dll a été compilée? Je ne peux pas faire confiance au code source car je pense qu'il a été mis à niveau vers Visual Studio 2008 et changé vers .NET Framework version 3.5.

mpenrow
la source

Réponses:

49

Chargez-le dans Reflector et voyez ce qu'il fait référence?

par exemple:

entrez la description de l'image ici

ParmesanCodice
la source
1
Mon idée aussi, mais connaissant le réflecteur, il se plaindra probablement, et lui donnera une belle icône d'erreur non descriptive.
leppie
@leppie ne devrait pas être un problème, même si c'est .NET 1.1. Modifiez simplement votre liste d'assemblage par défaut.
ParmesanCodice
Votre réponse est très utile, mais je vous conseille de ne pas vous y fier aveuglément - hier, j'ai passé trop de temps sur mon propre projet qui était ciblé pour .Net 4.0, signalé par Reflector pour utiliser .Net 4.0.3, et requis pour utiliser .Net 4.5 par Windows :-) Je ne connais aucune méthode pour vérifier cela sur un projet autre qu'avec des sources - voir ici: stackoverflow.com/questions/13214503
...
3
Vous pouvez également utiliser l'alternative gratuite et open source ILSpy, comme l'a noté Kat Lim Ruiz.
Marcus Mangelsdorf le
Cette réponse a fonctionné pour moi: stackoverflow.com/a/3461027/2961177 .
ckkkitty
128

Dans PowerShell, vous pouvez utiliser ce qui suit pour obtenir le runtime cible:

$path = "C:\Some.dll"
[Reflection.Assembly]::ReflectionOnlyLoadFrom($path).ImageRuntimeVersion

J'ai adapté cela à PowerShell à partir de la réponse de Ben Griswold .

Si vous souhaitez connaître la version du framework cible spécifiée dans Visual Studio, utilisez:

$path = "C:\Some.dll"
[Reflection.Assembly]::ReflectionOnlyLoadFrom($path).CustomAttributes |
Where-Object {$_.AttributeType.Name -eq "TargetFrameworkAttribute" } | 
Select-Object -ExpandProperty ConstructorArguments | 
Select-Object -ExpandProperty value

Vous devriez obtenir quelque chose comme

.NETFramework, Version = v4.5.2

Swoogan
la source
4
Cette réponse est la plus utile. Tous les systèmes d'exploitation Windows après 2003 prennent en charge Powershell. Un shell donnant une rétroaction immédiate, ne nécessitant aucun support d'application supplémentaire comme le suggèrent de nombreuses autres réponses. Idéal pour une vérification "unique" d'une DLL. vous êtes l'homme @swoogan.
Nathan McCoy
1
J'ai fait cela pour une DLL que j'ai construite avec une TargetFrameworkVersion de la v3.5, et elle a renvoyé la v2.0.50727. Qu'est-ce que je rate?
BHSPitMonkey
4
@BHSPitMonkey il n'y a vraiment eu que 4 versions d'exécution: 1.0, 1.1, 2.0 et 4.0. .NET 3.0 et 3.5 compilent vers CLR version 2.0. msdn.microsoft.com/en-us/library/bb822049(v=vs.110).aspx
Swoogan
1
Ce script ne fournit que RuntimeVersion, la question concerne TargetFrameworkversion. Effectivement, pour tous les assemblys compilés avec 2.0, 3.0, 3.5, ce script montre la version Runtime comme 2.0.0.0
Kiran Vedula
3
Pour moi, ReflectionOnlyLoadFrom renvoie le ImageRuntimeVersion mais zéro CustomAttributes. L'utilisation de LoadFrom au lieu de ReflectionOnlyLoadFrom donne le résultat attendu. N'importe quelle raison? PSVersion 5.1.16299.251 CLRVersion 4.0.30319.42000
Bernard Vander Beken
69

dotPeek est un excellent outil (gratuit) pour afficher ces informations.

Si vous rencontrez quelques problèmes pour vous procurer Reflector, c'est une bonne alternative.

entrez la description de l'image ici

wal
la source
4
Pour info, je suis passé de DotPeek à JustDecompile à cause d'un problème: si vous sélectionnez "version spécifique = false", DotPeek a montré une version vide, et JustDecompile affiche la version correcte. Cela valait la peine de changer pour moi.
ashes999
Génial - a fait exactement ce que je voulais sans installer un essai pour Reflector.
bernhardrusch
49

Vous pouvez utiliser ILDASM ...

ildasm.exe C:\foo.dll /metadata[=MDHEADER] /text /noil

et vérifiez la «section Métadonnées» dans la sortie. Ce serait quelque chose comme ça:

Section de métadonnées: 0x424a5342, version: 1.1, extra: 0, version len: 12, version: v4.0.30319

La balise 'version' vous indiquera la version du .NET Framework. Dans l'exemple ci-dessus, il s'agit de 4.0.30319

Josh Stodola
la source
3
Qu'est-ce que je cherche ici? Cela signifie-t-il .NET 4.0? // Metadata section: 0x424a5342, version: 1.1, extra: 0, version len: 12, versio n: v4.0.30319
PeterX
Oui, pour .NET 2, j'obtiens ce qui suit: // section Métadonnées: 0x424a5342, version: 1.1, extra: 0, version len: 12, version: v2.0.50727
Simon
17

Vous avez quelques options: Pour l'obtenir par programme, à partir du code managé, utilisez Assembly.ImageRuntimeVersion:

Dim a As Assembly = Reflection.Assembly.ReflectionOnlyLoadFrom("C:\path\assembly.dll")
Dim s As String = a.ImageRuntimeVersion

Depuis la ligne de commande, à partir de la v2.0, ildasm.exe l'affichera si vous double-cliquez sur "MANIFEST" et recherchez "Metadata version". Détermination de la version CLR d'une image

Ben Griswold
la source
Comment obtenir ImageRuntimeVersion pour CurrentAppDomain?
Kiquenet
17

Utilisez ILSpy http://ilspy.net/

open source, gratuit, définitivement une option puisque maintenant réflecteur est payé.

Kat Lim Ruiz
la source
15

Tout simplement

var tar = (TargetFrameworkAttribute)Assembly
          .LoadFrom("yoursAssembly.dll")
          .GetCustomAttributes(typeof(TargetFrameworkAttribute)).First();
durement
la source
1
Je ne sais pas pourquoi cela a été critiqué, mais je peux exécuter l'extrait (une référence à System.Runtime.Versioning est nécessaire) et obtenir avec succès la sortie (cela provient de LINQPad): TypeId typeof (TargetFrameworkAttribute) FrameworkName .NETFramework, Version = v4.0 FrameworkDisplayName .NET Framework 4
Sudhanshu Mishra
Ce code ne récupère pas la version complète du framework. "4.0" est bon à savoir, mais "v4.0.30319" serait plus utile si vous essayiez, par exemple, d'accéder à RegAsm.exe. Les informations de version les plus complètes se trouvent dans: string tar = Assembly.LoadFrom (@ "myAssembly.dll"). ImageRuntimeVersion;
Martin
Cela semble être la bonne approche, y a-t-il des circonstances où un assembly pourrait ne pas avoir cet attribut appliqué? Je l'ai testé avec un assembly .NET Core et il signale correctement netcore et le numéro de version.
Adam Naylor
Cela ne fonctionne pas pour moi. Le GetCustomAttributesn'a pas de fichier TargetFrameworkAttribute. Mais ImageRuntimeVersion fonctionne bien cependant, il récupère le bon CLR pour lequel le binaire a été construit. J'ai besoin de la version du framework cible pour laquelle il a été construit.
Shameel Mohamed
13

Encore une autre option via Visual Studio, ajoutez une référence à la DLL à n'importe quel projet, puis cliquez avec le bouton droit sur la nouvelle référence et cliquez sur Propriétés, vous pouvez voir ce que vous recherchez dans la version Runtime:

entrez la description de l'image ici

lingo_journey
la source
Je pense que cette question ne concerne pas le moment où une DLL est référencée dans Visual Studio, mais toute ancienne DLL .NET que vous trouvez traîner sur votre PC.
ashes999
7
Cette réponse indique que vous pouvez ajouter une référence à n'importe quelle ancienne DLL .NET que vous trouvez traîner sur votre PC, et l'une des propriétés de l'élément sous les références correspondant à cette DLL est la «version d'exécution».
ALEXintlsos
8

Décompilez-le avec ILDASM, et regardez la version de mscorlib qui est référencée (devrait être à peu près tout en haut).

leppie
la source
4

Le moyen le plus simple: ouvrez simplement le fichier .dll dans n'importe quel éditeur de texte. Regardez l'une des dernières lignes: entrez la description de l'image ici

Cedenbal
la source
La meilleure option parmi toutes
Sisir le
2
Cependant, cela ne fonctionne pas pour les dll construites avant .Net 3.0
Sisir
2

J'ai rapidement écrit cette application console C # pour ce faire:

https://github.com/stuartjsmith/binarydetailer

Passez simplement un répertoire en paramètre et il fera de son mieux pour vous indiquer le framework net pour chaque dll et exe qu'il contient

stuartjsmith
la source
Donne de bonnes informations détaillées; c'est une application de ligne de commande; vous devez lui transmettre le nom du répertoire sur la ligne de commande.
philu le
2

" Detect It Easy " également connu sous le nom de DiE est un programme pour déterminer les types de fichiers. Fonctionne avec les fichiers .dll ou d'autres fichiers (.exe). Absolument gratuit pour un usage commercial et non commercial.

entrez la description de l'image ici

20AMax
la source
0

Si vous avez DotPeekde JetBrains, vous pouvez le voir dans Assembly Explorer.

Pouvez-vous voir cette capture d'écran?  je ne suis pas:(

Sam Sch
la source
0

En développant les réponses ici, cela peut exploser s'il existe un assemblage dépendant. Si vous avez de la chance et que vous savez où se trouve la personne à charge (ou même plus chanceuse, c'est dans le GAC), cela peut aider ...

using System.Reflection;
using System.Runtime.Versioning;
// ...
{
    AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += new ResolveEventHandler(CurrentDomain_ReflectionOnlyAssemblyResolve);
    var asm = System.Reflection.Assembly.LoadFrom(@"C:\Codez\My.dll");
    var targetFrameAttribute = asm.GetCustomAttributes(true).OfType<TargetFrameworkAttribute>().FirstOrDefault();
    targetFrameAttribute.Dump();
}

Assembly CurrentDomain_ReflectionOnlyAssemblyResolve(object sender, ResolveEventArgs args)
{
    var name = args.Name;

    if (name.StartsWith("Depends"))
        return System.Reflection.Assembly.ReflectionOnlyLoadFrom(@"C:\Codez\Depends.dll");

    return System.Reflection.Assembly.ReflectionOnlyLoad(args.Name);
}

Référence: https://weblog.west-wind.com/posts/2006/Dec/22/Reflection-on-Problem-Assemblies

Type CAD
la source