Obtenir le PublicKeyToken des assemblys .Net

163

Quel est le moyen le plus simple de trouver le jeton de clé publique d'un assembly?

Le moyen le plus simple auquel je puisse penser serait un simple clic droit, obtenir la clé publique, mais cette fonctionnalité n'est pas là, peut-être qu'il existe une extension Visual Studio pour cela?

J'utilise Visual Studio 2010, si une extension est disponible.

moi_meme
la source
4
Voir ce billet de blog de Kirk Evans comment obtenir PublicKeyToken d'un assembly dans Visual Studio: blogs.msdn.com/b/kaevans/archive/2008/06/18
Martin Buberl
2
Je viens d'installer EF6 et honnêtement, je ne sais même pas où se trouvent les assemblages. La merde comme ça prend des heures de ma journée.
froggythefrog

Réponses:

228

Ouvrez une invite de commande et tapez l'une des lignes suivantes en fonction de votre version de Visual Studio et de l'architecture du système d'exploitation:

VS 2008 sur Windows 32 bits :

"%ProgramFiles%\Microsoft SDKs\Windows\v6.0A\bin\sn.exe" -T <assemblyname>

VS 2008 sur Windows 64 bits:

"%ProgramFiles(x86)%\Microsoft SDKs\Windows\v6.0A\bin\sn.exe" -T <assemblyname>

VS 2010 sur Windows 32 bits:

"%ProgramFiles%\Microsoft SDKs\Windows\v7.0A\bin\sn.exe" -T <assemblyname>

VS 2010 sur Windows 64 bits:

"%ProgramFiles(x86)%\Microsoft SDKs\Windows\v7.0A\bin\sn.exe" -T <assemblyname>

VS 2012 sur Windows 32 bits:

"%ProgramFiles%\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\sn.exe" -T <assemblyname>

VS 2012 sur Windows 64 bits:

"%ProgramFiles(x86)%\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\sn.exe" -T <assemblyname>

VS 2015 sur Windows 64 bits:

"%ProgramFiles(x86)%\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\sn.exe" -T <assemblyname>

Notez que pour les versions VS2012 +, l'application sn.exe n'est plus dans le bac mais dans un sous-dossier. Notez également que pour 64 bits, vous devez spécifier le dossier (x86).

Si vous préférez utiliser l'invite de commande Visual Studio, tapez simplement:

sn -T <assembly> 

<assemblyname>est un chemin d'accès complet au fichier de l'assembly qui vous intéresse, entouré de guillemets s'il contient des espaces.

Vous pouvez l'ajouter en tant qu'outil externe dans VS, comme indiqué ici:
http://blogs.msdn.com/b/miah/archive/2008/02/19/visual-studio-tip-get-public-key-token -pour-un-assemblage-nommé-stong.aspx

digEmAll
la source
1
Ouais je sais ça, je cherche un moyen plus simple, de préférence sans quitter VS
moi_meme
12
Remplacez% ProgramFiles% par% ProgramFiles (x86)% si vous êtes sur une machine 64 bits.
System.Cats.Lol
1
Pour VS2012, c'est sous "%ProgramFiles(x86)%\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\sn.exe" -T <assemblyname>. Remarque sn est caché dans un niveau de dossier supplémentaire après bin (dans NETFX 4.0 Tools).
GDS
2
Belle réponse élaborée. Pour VS2015, il devrait être sous% ProgramFiles (x86)% \ Microsoft SDKs \ Windows \ v10.0A \ bin \ NETFX 4.6.1 Tools \ sn.exe
ThePatelGuy
1
Le chemin VS2015 devrait être v10.0A, pas V1.0A
Michael Itzoe
87

une autre option:

si vous utilisez PowerShell, vous pouvez découvrir comme:

PS C:\Users\Pravat> ([system.reflection.assembly]::loadfile("C:\Program Files (x86)\MySQL\Connector NET 6.6.5\Assemblies\v4.0\MySql.Data.dll")).FullName

comme

PS C:\Users\Pravat> ([system.reflection.assembly]::loadfile("dll full path")).FullName

et apparaîtra comme

MySql.Data, Version = 6.6.5.0, Culture = neutre, PublicKeyToken = c5687fc88969c44d

Mujah Maskey
la source
Génial, me permet de copier et coller le résultat entier directement dans une configuration Web si j'ajoute manuellement des assemblages. Merci!
GJKH
Excellente réponse, car vous pouvez également obtenir la version (ce qui peut être important pour le dépannage).
sbkrogers
48

Si la bibliothèque est incluse dans le projet VS, vous pouvez vérifier le .cprojfichier, par exemple:

<ItemGroup>
    <Reference Include="Microsoft.Dynamic, Version=1.1.0.20, Culture=neutral, PublicKeyToken=7f709c5b713576e1, processorArchitecture=MSIL">
...
user2341923
la source
2
Je ne vois que <Reference Include = "System.IdentityModel" /> (idem pour les autres asseblies)
FrenkyB
Ne semble pas être très utile pour les assemblys dans les bibliothèques système .NET. par exemple pour System.Configuration il dit juste<Reference Include="System.Configuration" />
Simon Tewsi
Il semble que tous les assemblages ont la même chose PublicKeyToken, donc une seule recherche dans le .cprojsemble être la solution la plus simple.
asdf
14

Si vous avez inclus l'assemblage dans votre projet, vous pouvez faire:

            var assemblies =
                AppDomain.CurrentDomain.GetAssemblies();


            foreach (var assem in assemblies)
            {
                    Console.WriteLine(assem.FullName);
            }
apoorv020
la source
il n'obtient pas le jeton de clé publique des dll dans mes références. Votre méthode obtient-elle vraiment toutes les dll dans les références d'un certain projet? merci
Francis Saul
@FrancisSaul - il ne listera que les assemblys qui ont été CHARGÉS dans la mémoire de processus de votre application; pour afficher les détails d'un assembly spécifique, exécutez d'abord le code qui fait référence à un type de cet assembly. Par exemple, créez une nouvelle instance d'une classe dans cet assembly.
ToolmakerSteve
C'était la méthode la plus simple qui a fonctionné pour moi. Cela peut être simplifié davantage: exécutez l'application avec un ensemble de points d'arrêt. Lorsque l'exécution se met en pause sur le point d' arrêt, dans le type de fenêtre immédiate VS: AppDomain.CurrentDomain.GetAssemblies(). Cela listera les assemblys chargés dans la fenêtre Exécution, avec Version, Culture et PublicKeyToken pour chacun.
Simon Tewsi
Il est également possible d'exécuter en 'C # Interactive' - aucune compilation nécessaire!
bTab
13

Vous pouvez l'obtenir facilement via c #

private static string GetPublicKeyTokenFromAssembly(Assembly assembly)
{
    var bytes = assembly.GetName().GetPublicKeyToken();
    if (bytes == null || bytes.Length == 0)
        return "None";

    var publicKeyToken = string.Empty;
    for (int i = 0; i < bytes.GetLength(0); i++)
        publicKeyToken += string.Format("{0:x2}", bytes[i]);

    return publicKeyToken;
}
Adam Caviness
la source
J'ai essayé votre code mais cela ne fonctionne pas. Je veux obtenir le jeton de clé publique de Stimulsoft.Report.Web.dll qui est déjà dans mes références. J'ai copié votre code et passé le nom de la DLL mais cela ne fonctionne pas. Mon code ressemble à ceci: string s = GetPublicKeyTokenFromAssembly ("Stimulsoft.Report.Web"). De toute évidence, la méthode accepte l'assembly, pas un nom de chaîne. Pouvez-vous m'aider à utiliser votre méthode?
Francis Saul
@FrancisSaul Que renvoie la méthode, "Aucun" ou une valeur incorrecte? Avez-vous déterminé que l'assemblée porte en effet un nom fort? Vous pouvez vérifier dans VS sur le panneau des propriétés pour la référence (Strong Name). Vous pouvez également le vérifier facilement avec la plupart des décompilateurs gratuits comme JustDecompile. Si vous voyez qu'il porte un nom fort, déboguez le code et inspectez les octets.
Adam Caviness
Je ne peux pas exécuter le projet, après avoir tapé la chaîne de code s = GetPublicKeyTokenFromAssembly ("Stimulsoft.Report.Web"), il dit que la meilleure surcharge pour la méthode a des arguments invalides.
Francis Saul
@FrancisSaul Vous passez un argument de chaîne à une méthode qui prend un Assembly. Vous pouvez typeof(YourPreferredTypeInThatAssembly).Assemblyou Assembly.GetAssembly(typeof(YourPreferredTypeInThatAssembly))et transmettre cela à la méthode si vous le souhaitez.
Adam Caviness
Donc la syntaxe serait comme ça. Assembly.GetAssembly (typeof ("Stimulsoft.Report.Web.dll));
Francis Saul
9

Vous pouvez l'ajouter en tant qu'outil externe à Visual Studio comme ceci:

Titre:

Get PublicKeyToken

Commander:

c:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\sn.exe

(Le chemin peut différer entre les versions)

Arguments:

-T "$(TargetPath)"

Et cochez l' option " Utiliser la fenêtre de sortie ".

Danny Varod
la source
1
Lorsque vous sélectionnez cela dans le Toolsmenu, il fonctionnera automatiquement sur le projet que vous avez sélectionné dans l'Explorateur de solutions.
Contango
J'ai renommé ma commande en Get PublicKeyToken on Solution Explorer Selection.
Contango
1
Bonne réponse! Astuce: Si vous cochez la case "Demander des arguments", une boîte de dialogue s'ouvre, vous permettant d'y coller un chemin. Ainsi, vous pouvez copier + coller un chemin d'assemblage à partir de la fenêtre des propriétés, par exemple. Cela a été très utile pour moi, en particulier lorsque je devais modifier les enregistrements dans le fichier web.config et que je ne connaissais pas un jeton de clé publique DLL.
Matt
8

Le moyen le plus simple pour moi est d'utiliser ILSpy .

Lorsque vous faites glisser et déposez l'assemblage sur sa fenêtre et sélectionnez l'assemblage déposé sur la gauche, vous pouvez voir le jeton de clé publique sur le côté droit de la fenêtre.

(Je pense aussi que les nouvelles versions afficheront également la clé publique de la signature, si jamais vous en avez besoin ... Voir ici: https://github.com/icsharpcode/ILSpy/issues/610#issuecomment-111189234 . Bon produit! ;))

user2173353
la source
5

1) La commande est C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\sn -T {your.dll}

Dans l'exemple ci-dessus, le Kit de développement logiciel (SDK) Microsoft réside dans C: \ Program Files \ Microsoft SDKs \ Windows \ v6.0A. Votre environnement peut différer.

2) Pour obtenir le jeton de clé publique de l'un de vos projets, vous pouvez ajouter sn.exe dans le cadre de vos outils externes dans Visual Studio. Les étapes sont indiquées dans ce lien Microsoft: Comment: créer un outil pour obtenir la clé publique d'un assembly

Syd
la source
Ouais je sais ça, je cherche un moyen plus simple, de préférence sans quitter VS
moi_meme
5

Comme alternative, vous pouvez également utiliser linqcomme ceci -

    string key = string.Join ("",assembly
                                .GetName()
                                .GetPublicKeyToken()
                                .Select (b => b.ToString ("x2")));
Yogi
la source
1
Il a demandé le jeton de clé publique. Votre code utilise la clé publique. Ça devrait être.GetPublicKeyToken()
Stefan né
1

Une autre méthode serait si vous avez un décompilateur, recherchez-le simplement là-bas, ils fournissent généralement la clé publique. J'ai regardé .Net Reflector, Telerik Just Decompile et ILSpy décompilent simplement, ils semblent afficher le jeton de clé publique.

bhupendra patel
la source
1

Une autre option consiste à utiliser l'outil open source NuGet Package Explorer pour cela.

À partir d'un package Nuget (.nupkg), vous pouvez vérifier le PublicKeyToken ou faire glisser le binaire (.dll) dans l'outil. Pour ce dernier, sélectionnez d'abord "Fichier -> nouveau"

entrez la description de l'image ici

julien
la source