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


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

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 .


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

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 .


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

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.


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


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


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


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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.