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?

Matthew Jones
la source
Copie

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
danielB
la source
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 .

Darin Dimitrov
la source
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" />
Zanon
la source
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 .

Joaquim Rendeiro
la source
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
Prasanna Balajee
la source
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é.

Mike Honey
la source
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

Hiram
la source
Si vous ouvrez une invite de commande Visual Studio, elle devrait se trouver sur votre chemin.
Nattrass
Découvrez ceci: stackoverflow.com/questions/3045033/…
ThePatelGuy
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

CRice
la source
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

Vinod Srivastav
la source
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.

Mohit Verma
la source