¿Cómo encuentro el PublicKeyToken para un dll particular?

197

Necesito recrear un proveedor en mi archivo web.config que se parece a esto:

<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>

Sin embargo, recibo un error de tiempo de ejecución que dice que este ensamblado no se puede cargar, y creo que es porque tengo el PublicKeyToken incorrecto. ¿Cómo busco el PublicKeyToken para mi ensamblado?

Alternativamente, ¿voy completamente por el camino equivocado con esto?

Matthew Jones
fuente
Posible duplicado de Obtención de PublicKeyToken de ensamblados .Net
Michael Freidgeim

Respuestas:

282

Usando PowerShell , puede ejecutar esta declaración:

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

La salida proporcionará la Versión , Cultura y PublicKeyToken como se muestra a continuación:

MyDLL, Version=1.0.0.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a
danielB
fuente
1
¡Gracias! su método es el único que funcionó para mí sn -T dllname.dll solo mostraba texto de ayuda cuando lo ejecuté
Vdex
1
¡Eso es perfecto! Evita instalar herramientas adicionales.
nirav
1
¡Excelente! esto también funciona cuando no hay PublicKeyToken disponible (es decir, ensamblados sin firmar)
MovGP0
2
En C # Interactive, puede llamar a: Console.WriteLine (System.Reflection.Assembly.LoadFile (@ "c: \ some.dll"). FullName);
Auri Rahimzadeh
2
Molesto, PowerShell.exe mantiene un bloqueo en el dll incluso después de que se complete la llamada. Necesitaba cerrar la consola de PowerShell antes de poder construir mi solución nuevamente.
Cee McSharpface
141

Utilizando utilidad sn.exe :

sn -T YourAssembly.dll

o cargando el ensamblaje en Reflector .

Darin Dimitrov
fuente
31
sn.exe generalmente se puede encontrar en una de las siguientes ubicaciones en C: \ Archivos de programa (x86) \ Microsoft SDKs \ Windows: C: \ Archivos de programa (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin, C: \ Archivos de programa (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin \ x64, C: \ Archivos de programa (x86) \ Microsoft SDKs \ Windows \ v8.0A \ bin \ NETFX 4.0 Herramientas
david.barkhuizen
Eso sí, la clave distingue entre mayúsculas y minúsculas. -t (en minúsculas) mostrará "Error al convertir la clave en token - Clave pública de ensamblado no válida", lo que lo enviará a buscar en la dirección incorrecta.
access_granted
31

Si tiene la DLL agregada a su proyecto, puede abrir el archivo csproj y ver la etiqueta de Referencia.

Ejemplo:

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

sn -T <assembly>en la línea de comando de Visual Studio. Si se instala un ensamblaje en la caché de ensamblados global, es más fácil ir a él C:\Windows\assemblyy encontrarlo en la lista de ensamblajes GAC.

En su caso específico, es posible que esté mezclando el nombre completo del tipo con la referencia del ensamblaje, es posible que desee echar un vistazo a MSDN .

Joaquim Rendeiro
fuente
8

La respuesta es muy simple: use las herramientas de .NET Framework sn.exe . Abra el símbolo del sistema de Visual Studio 2008 y luego apunte a la carpeta de la DLL que desea obtener la clave pública,

Usa el siguiente comando,

sn –T myDLL.dll

Esto le dará el token de clave pública. Recuerde una cosa que esto solo funciona si el ensamblaje tiene que estar fuertemente firmado.

Ejemplo

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

Microsoft (R) .NET Framework Strong Name Utility Versión 3.5.21022.8
Copyright (c) Microsoft Corporation. Todos los derechos reservados.

El token de clave pública es b77a5c561934e089
Prasanna Balajee
fuente
Si tiene Visual Studio 2013 y no puede encontrar el "Símbolo del sistema del desarrollador para VS2013", eche un vistazo aquí para solucionarlo: stackoverflow.com/a/22702405/187650
juFo
Tenga en cuenta que esta herramienta no viene con Windows.
Ian Boyd
4

Utilizo el Explorador de Windows, navego a C: \ Windows \ assembly, encuentro el que necesito. Desde las Propiedades, puede copiar PublicKeyToken.

Esto no depende de Visual Studio ni de ninguna otra utilidad instalada.

Mike Honey
fuente
3

Simplemente agregando más información, no pude encontrar la utilidad sn.exe en las ubicaciones mencionadas, en mi caso fue en C: \ Archivos de programa (x86) \ Microsoft SDKs \ Windows \ v7.0A \ bin

Hiram
fuente
Si abre un símbolo del sistema de Visual Studio, debe estar en su camino.
Nattrass
2

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

Resultará en

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

CRice
fuente
1

Como dijo @CRice, puede usar el siguiente método para obtener una lista de ensamblaje dependiente con 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;
}

generalmente lo uso como un script de LinqPad , puede llamarlo como

DependencyInfo("@c:\MyAssembly.dll"); del código

Vinod Srivastav
fuente
0

También puede verificar siguiendo el método.

Vaya a Ejecutar: escriba la ruta de la DLL para la que necesita la clave pública. Encontrará 2 archivos: 1. __AssemblyInfo_.ini 2. Archivo DLL

Abra este archivo __AssemblyInfo_.ini en el bloc de notas, aquí puede ver el token de clave pública.

Mohit Verma
fuente