Comment puis-je trouver le PublicKeyToken pour une DLL particulière?


197

J'ai besoin de recréer un fournisseur dans mon fichier web.config qui ressemble à ceci:

<membership defaultProvider="AspNetSqlMemProvider">
  <providers>
    <clear/>
    <add connectionStringName="TRAQDBConnectionString" applicationName="TRAQ" minRequiredPasswordLength="7" minRequiredNonalphanumericCharacters="0"
         name="AspNetSqlMemProvider"
         type="System.Web.Security.SqlMembershipProvider, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"
    />
  </providers>
</membership>

Cependant, j'obtiens une erreur d'exécution disant que cet assembly ne peut pas être chargé, et je pense que c'est parce que j'ai le mauvais PublicKeyToken. Comment rechercher le PublicKeyToken pour mon assembly?

Sinon, est-ce que je vais tout à fait dans le mauvais sens?


Réponses:


283

À l'aide de PowerShell , vous pouvez exécuter cette instruction:

([system.reflection.assembly]::loadfile("c:\MyDLL.dll")).FullName

La sortie fournira la version , la culture et le PublicKeyToken comme indiqué ci-dessous:

MyDLL, Version=1.0.0.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a

1
Merci! votre méthode est la seule qui a fonctionné pour moi sn -T dllname.dll n'afficherait le texte d'aide que lorsque je l'ai exécuté
Vdex

1
C'est parfait! Évite d'installer des outils supplémentaires.
nirav

1
génial! cela fonctionne également quand il n'y a pas de PublicKeyToken disponible (c'est-à-dire des assemblages non signés)
MovGP0

2
Dans C # Interactive, vous pouvez appeler: Console.WriteLine (System.Reflection.Assembly.LoadFile (@ "c: \ some.dll"). FullName);
Auri Rahimzadeh

2
De façon ennuyeuse, PowerShell.exe garde un verrou sur la DLL même après la fin de l'appel. J'ai dû fermer la console PowerShell avant de pouvoir reconstruire ma solution.
Cee McSharpface

141

Utilisation de l' utilitaire sn.exe :

sn -T YourAssembly.dll

ou en chargeant l'assemblage dans le réflecteur .


31
sn.exe se trouve généralement à l'un des emplacements suivants sous C: \ Program Files (x86) \ Microsoft SDKs \ Windows: C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin, C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin \ x64, C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v8.0A \ bin \ NETFX 4.0 Tools
david.barkhuizen

Attention, la clé est sensible à la casse. -t (en minuscules) donnera la "Échec de la conversion de la clé en jeton - Clé publique d'assembly non valide.", qui vous enverra la recherche dans la mauvaise direction.
access_granted

31

Si la DLL est ajoutée à votre projet, vous pouvez ouvrir le fichier csproj et voir la balise Reference.

Exemple:

<Reference Include="System.Web.Mvc, Version=3.0.0.1, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />

23

sn -T <assembly>dans la ligne de commande Visual Studio. Si un assembly est installé dans le cache d'assembly global, il est plus facile de le C:\Windows\assemblyrechercher et de le trouver dans la liste des assemblys GAC.

Dans votre cas spécifique, vous pouvez mélanger le nom complet du type avec la référence de l'assembly, vous pouvez jeter un œil à MSDN .


8

La réponse est très simple, utilisez les outils .NET Framework sn.exe. Ouvrez donc l'invite de commandes de Visual Studio 2008, puis pointez sur le dossier de la DLL où vous souhaitez obtenir la clé publique,

Utilisez la commande suivante,

sn –T myDLL.dll

Cela vous donnera le jeton de clé publique. N'oubliez pas une chose qui ne fonctionne que si l'assemblage doit être fortement signé.

Exemple

C: \ WINNT \ Microsoft.NET \ Framework \ v3.5> sn -T EdmGen.exe

Microsoft (R) .NET Framework Strong Name Utility version 3.5.21022.8
Copyright (c) Microsoft Corporation. Tous les droits sont réservés.

Le jeton de clé publique est b77a5c561934e089

Si vous avez Visual Studio 2013 et que vous ne trouvez pas «Prompt Command Command for VS2013», allez voir ici comment y remédier: stackoverflow.com/a/22702405/187650
juFo

Notez que cet outil n'est pas fourni avec Windows.
Ian Boyd

4

J'utilise l'Explorateur Windows, accédez à C: \ Windows \ assembly, trouvez celui dont j'ai besoin. Dans les propriétés, vous pouvez copier le PublicKeyToken.

Cela ne dépend pas de Visual Studio ou de tout autre utilitaire installé.


3

En ajoutant simplement plus d'informations, je n'ai pas pu trouver l'utilitaire sn.exe dans les emplacements mentionnés, dans mon cas, c'était dans C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v7.0A \ bin


Si vous ouvrez une invite de commande Visual Studio, elle devrait se trouver sur votre chemin.
Nattrass


2

Assembly.LoadFile (@ "C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ system.data.dll"). FullName

Aura pour résultat

System.Data, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089


1

Comme l'a dit @CRice, vous pouvez utiliser la méthode ci-dessous pour obtenir une liste des assemblys dépendants avec publicKeyToken

public static int DependencyInfo(string args) 
{
    Console.WriteLine(Assembly.LoadFile(args).FullName);
    Console.WriteLine(Assembly.LoadFile(args).GetCustomAttributes(typeof(System.Runtime.Versioning.TargetFrameworkAttribute), false).SingleOrDefault());
    try {
        var assemblies = Assembly.LoadFile(args).GetReferencedAssemblies(); 

        if (assemblies.GetLength(0) > 0)
        {
            foreach (var assembly in assemblies)
            {
                Console.WriteLine(" - " + assembly.FullName + ", ProcessorArchitecture=" + assembly.ProcessorArchitecture);             
            }
            return 0;
        }
    }
    catch(Exception e) {
        Console.WriteLine("An exception occurred: {0}", e.Message);
        return 1;
    } 
    finally{}

    return 1;
}

je l'utilise généralement comme un script LinqPad , vous pouvez l'appeler comme

DependencyInfo("@c:\MyAssembly.dll"); du code


0

Vous pouvez également vérifier par la méthode suivante.

Accédez à Exécuter: tapez le chemin d'accès de la DLL pour laquelle vous avez besoin d'une clé publique. Vous trouverez 2 fichiers: 1. __AssemblyInfo_.ini 2. Fichier DLL

Ouvrez ce fichier __AssemblyInfo_.ini dans le bloc-notes, ici vous pouvez voir le jeton de clé publique.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.