ildasm.exe montrera si vous double-cliquez sur le "MANIFESTE" et de chercher des "Métadonnées version". Par défaut, c'est la version que l'image a été compilé avec.
Pour l'ouvrir, peut-être, appuyez sur "Win-Démarrer", tapez "demander" et ouvrez votre Visual-Studio "Développeur de l'Invite de Commande pour VS XXXX". Ensuite, vous pouvez utiliser 'ildasm" via la ligne de commande ou le type 'ildasm.exe" pour ouvrir l'INTERFACE utilisateur et de l'utiliser comme décrit à cette réponse. J'ai trouvé ' [mscorlib]Système.Moment de l'exécution.La gestion des versions.TargetFrameworkAttribute::.ctor(string) " qui comprend le cadre de version. (Peut-être de maximiser la fenêtre. Côté droit de Hex-Valeur ASCII-Interpretaion de celui-ci)
Le problème avec tous les moyens mentionnés est qu'ils seront de retour en version 4.0 si le montage a été compilé avec .NET framework 4.0, 4.5 ou 4.5.1.
La façon de déterminer cette version par programme au moment de l'exécution est d'utiliser le Système.Moment de l'exécution.La gestion des versions.TargetFrameworkAttribute pour l'assemblée, par exemple
usingSystem;usingSystem.Linq;usingSystem.Reflection;usingSystem.Runtime.Versioning;...object[] list =Assembly.GetExecutingAssembly().GetCustomAttributes(true);var attribute = list.OfType<TargetFrameworkAttribute>().First();Console.WriteLine(attribute.FrameworkName);Console.WriteLine(attribute.FrameworkDisplayName);
Il a essayé avec un programme compilé avec la ligne de commande csc, ne fonctionne pas (pas de TargetFrameworkAttribute). BTW. votre code peut être simplifié à: System.Runtime.Versioning.TargetFrameworkAttribute a = list.OfType<System.Runtime.Versioning.TargetFrameworkAttribute>().First();
Il est uniquement disponible en .NET 4.0 et plus, et ouais code peut être simplifié.
Visual Studio jeux de la .Version NET dans le csproj, si la compilation d'un seul .cs fichier, essayez de créer un csproj et exécuté, par exemple, msbuild myproject.csproj /p:Configuration=Debug /p:Plate-forme="Any CPU"
Bien sûr, cela ne fonctionne pas pour les assemblées compilé pour les versions < 4, comme ils n'ont pas l'attribut en eux. C'est, si vous voulez savoir ce que le cible (pas d'exécution cible) d'un assembly compilé que vous avez été donné, et que l'assemblée est antérieure à la v4, cela ne fonctionne pas.
Compiler et exécuter l'application ci-dessus, en vertu de la dernière .NET Framework (comme un ancien CLR peut-être pas à la charge des assemblages nécessitant une nouvelle CLR) et l'exécuter en passant le chemin d'accès à l'assemblée, vous voulez vérifier que l'argument de ligne de commande.
Cette réponse est problématique lors du chargement âgées en mode mixte assemblées, sans useLegacyV2RuntimeActivationPolicy config drapeau.
Je vous remercie. Avait une vieille .NET dll, CCW, je suis réécriture/remplacer avec une version 64 bits .NET 4 version et pour la vie de moi ne pouvait pas se rappeler pour sûr si l'original était encore .NET v1.1 ou a été touché par un avant projet de migration et de mise à niveau pour v2.x. De ce fait, le truc bien et a confirmé notre prod version est toujours en v1.1.4322.
Voici un PowerShell équivalent de la .NET code suggéré dans une autre réponse. À l'aide de PowerShell signifie que vous pouvez sauter quelques étapes, comme la création et la compilation d'une assemblée.
À une invite de PowerShell, exécutez la commande suivante:
Par défaut, PowerShell utilise le .NET v2 de l'exécution, de sorte que vous aurez une exception pour les assemblées cibler v4. Un Débordement de pile question Comment puis-je lancer PowerShell avec le .NET 4 runtime? détails méthodes pour modifier, si nécessaire.
Comme @mistika suggéré, il est préférable d'utiliser ReflectionOnlyLoadFrom() plutôt que LoadFrom(). L'inconvénient de cette est que l'appel à GetCustomAttributes() sur une assemblée chargée avec ReflectionOnlyLoadFrom() déclenche une exception. Vous devez appeler GetCustomAttributesData() à la place:
var assembly =Assembly.ReflectionOnlyLoadFrom(assemblyPath);var customAttributes = assembly.GetCustomAttributesData();var targetFramework = customAttributes.FirstOrDefault(attr => attr.AttributeType.Equals(typeof(TargetFrameworkAttribute)));var frameworkName =string.Empty;var frameworkDisplayName =string.Empty;if(null!= targetFramework){if(targetFramework.ConstructorArguments.Any()){//first argument is the name of the framework.
frameworkName =(string)targetFramework.ConstructorArguments[0].Value;}//search for a named argument called "FrameworkDisplayName"var frameworkDisplayNameArg = targetFramework.NamedArguments.FirstOrDefault(arg => arg.MemberName.Equals("FrameworkDisplayName"));if(null!= frameworkDisplayNameArg){
frameworkDisplayName =(string)frameworkDisplayNameArg.TypedValue.Value;}}Console.WriteLine("Framework Name: "+ frameworkName);Console.WriteLine("Framework Display Name: "+ frameworkDisplayName);
Un très bon outil est JustDecompile de Telerik. Vous pouvez ouvrir les assemblages et l'outil permettant de savoir si elles sont ciblage 4.5, 4.5.1 ou de 4,6
Si vous souhaitez inclure le résultat dans un script, je vous recommande d'utiliser le texte de sortie de ildasm.exe, puis grep "Chaîne de Version" à partir de la sortie.
Essayer cette Assemblée D'Information exécutable pour obtenir la version de l'assembly, qui vous dit CLR version il exige, et comme bien d'autres informations
comme les options de Compilation, Processeur Cible et Références:
Cela donne le version de l'assembly, pas la .Version Net nécessaire pour l'exécuter.
Ma réponse ne satisfaire OP besoin. bien qu'il ne donne pas .Version Net, mais il donne la version de l'assembly, qui raconte ce .Version Net il exige n'est " elle!. La plupart de la réponse ci-dessus montre l'obtention de la version de l'assembly vous devriez être en bas à droit de vote de tous!?
Vos mots, avec le texte en surbrillance dans l'image, suggère que votre réponse explique comment récupérer la version de l'assembly de l'assemblage initial (celui qui est mentionné dans le cas des OP question). Mais cette version de l'assembly n'a rien à voir avec la version de son cadre de dépendances. Si ce n'est pas ce que tu voulais dire, peut-être que vous devez formuler la réponse d'une autre manière, et peut-être remplacer la capture d'écran.
Je vous remercie de votre commentaire, mais vous m'a laissé plus de confusion avec la vôtre: "l'assemblée de la version originelle de l'assemblée"?. c'est soit la version de l'assembly (AKA la version de la dll) ou CLR version (version du moteur d'exécution que l'assemblée exige). btw, j'ai reformulé ma réponse espère que c'est plus clair maintenant.
"D'origine" c'est juste moi en se référant à l'assemblée qui a provoqué l'OP, pour poser la question en premier lieu. Contrairement à toute référencé (CLR ou pas) de l'assemblée.
"[...]exécutable pour obtenir la version de l'assembly, qui vous dit CLR version, il faut [...]", Mais la version de l'assembly ne pas vous dire qui CLR version qu'il utilise... La version de l'assembly de l'arbitraire d'un assemblage peut être absolument n'importe quoi!
ildasm.exe
montrera si vous double-cliquez sur le "MANIFESTE" et de chercher des "Métadonnées version". Par défaut, c'est la version que l'image a été compilé avec.Une clarification...
Le problème avec tous les moyens mentionnés est qu'ils seront de retour en version 4.0 si le montage a été compilé avec .NET framework 4.0, 4.5 ou 4.5.1.
La façon de déterminer cette version par programme au moment de l'exécution est d'utiliser le Système.Moment de l'exécution.La gestion des versions.TargetFrameworkAttribute pour l'assemblée, par exemple
Sera de retour
csc
, ne fonctionne pas (pas deTargetFrameworkAttribute
). BTW. votre code peut être simplifié à:System.Runtime.Versioning.TargetFrameworkAttribute a = list.OfType<System.Runtime.Versioning.TargetFrameworkAttribute>().First();
Compiler et exécuter l'application ci-dessus, en vertu de la dernière .NET Framework (comme un ancien CLR peut-être pas à la charge des assemblages nécessitant une nouvelle CLR) et l'exécuter en passant le chemin d'accès à l'assemblée, vous voulez vérifier que l'argument de ligne de commande.
Voici un PowerShell équivalent de la .NET code suggéré dans une autre réponse. À l'aide de PowerShell signifie que vous pouvez sauter quelques étapes, comme la création et la compilation d'une assemblée.
À une invite de PowerShell, exécutez la commande suivante:
Par défaut, PowerShell utilise le .NET v2 de l'exécution, de sorte que vous aurez une exception pour les assemblées cibler v4. Un Débordement de pile question Comment puis-je lancer PowerShell avec le .NET 4 runtime? détails méthodes pour modifier, si nécessaire.
En ligne de commande
DUMPBIN votre dll/exe /CLRHEADER
Voici une powershell un liner qui permettra d'afficher le Cible framework version pour les assemblages de ciblage v4 et.
utilisation:
Je suggérerais à l'aide de ReflectionOnlyLoadFrom() place de LoadFrom()
Il a un avantage que l'on peut charger x64 et ia64 assemblées lors de l'exécution sur une machine x86, alors que LoadFrom() échoue à le faire.
Si elle ne se charge toujours pas .Net 4.0 assemblées à partir d'une powershell 2.0.
Comme @mistika suggéré, il est préférable d'utiliser
ReflectionOnlyLoadFrom()
plutôt queLoadFrom()
. L'inconvénient de cette est que l'appel àGetCustomAttributes()
sur une assemblée chargée avecReflectionOnlyLoadFrom()
déclenche une exception. Vous devez appelerGetCustomAttributesData()
à la place:Un très bon outil est JustDecompile de Telerik. Vous pouvez ouvrir les assemblages et l'outil permettant de savoir si elles sont ciblage 4.5, 4.5.1 ou de 4,6
- Je utiliser ILSpy comme un remplacement pour le Réflecteur. Si vous avez ouvert l'assemblée en ILSpy, vous pouvez voir, par exemple:
[assembly: TargetFramework(".NETFramework,Version=v4.6.2", FrameworkDisplayName = ".NET Framework 4.6.2")]
C#
pour voir cette information.Si vous souhaitez inclure le résultat dans un script, je vous recommande d'utiliser le texte de sortie de
ildasm.exe
, puis grep "Chaîne de Version" à partir de la sortie.Remarque-je inclure un " donc la
find
commande ne reconnaît pas "la Version la Longueur de la Chaîne"Essayer cette Assemblée D'Information exécutable pour obtenir la version de l'assembly, qui vous dit CLR version il exige, et comme bien d'autres informations
comme les options de Compilation, Processeur Cible et Références: