Obtención de PublicKeyToken de ensamblados .Net


163

¿Cuál es la forma más sencilla de encontrar el token de clave pública de un ensamblado?

La forma más simple que se me ocurre sería hacer clic con el botón derecho del mouse, obtener la clave pública, pero esta funcionalidad no está allí, ¿tal vez hay una extensión de Visual Studio para eso?

Estoy usando Visual Studio 2010, si hay una extensión disponible.


44
Vea esta publicación de blog de Kirk Evans sobre cómo obtener PublicKeyToken de un ensamblaje dentro de Visual Studio: blogs.msdn.com/b/kaevans/archive/2008/06/18/…
Martin Buberl

2
Acabo de instalar EF6 y, sinceramente, ni siquiera sé dónde se encuentran los ensamblajes. Una mierda como esta lleva horas de mi día.
froggythefrog

Respuestas:


228

Abra un símbolo del sistema y escriba una de las siguientes líneas según su versión de Visual Studio y la arquitectura del sistema operativo:

VS 2008 en Windows de 32 bits :

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

VS 2008 en Windows de 64 bits:

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

VS 2010 en Windows de 32 bits:

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

VS 2010 en Windows de 64 bits:

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

VS 2012 en Windows de 32 bits:

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

VS 2012 en Windows de 64 bits:

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

VS 2015 en Windows de 64 bits:

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

Tenga en cuenta que para las versiones VS2012 +, la aplicación sn.exe ya no está en bin sino en una subcarpeta. Además, tenga en cuenta que para 64 bits debe especificar la carpeta (x86).

Si prefiere usar el símbolo del sistema de Visual Studio, simplemente escriba:

sn -T <assembly> 

donde <assemblyname>hay una ruta de archivo completa al ensamblado que le interesa, rodeado de comillas si tiene espacios.

Puede agregar esto como una herramienta externa en VS, como se muestra aquí:
http://blogs.msdn.com/b/miah/archive/2008/02/19/visual-studio-tip-get-public-key-token -for-a-stong-named-assembly.aspx


1
Sí, lo sé, estoy buscando una manera más fácil, preferiblemente sin salir de VS
moi_meme

12
Reemplace% ProgramFiles% con% ProgramFiles (x86)% si está en una máquina de 64 bits.
System.Cats.Lol

1
Para VS2012 está debajo "%ProgramFiles(x86)%\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\sn.exe" -T <assemblyname>. Tenga en cuenta que sn está escondido en un nivel de carpeta adicional después de bin (en NETFX 4.0 Tools).
GDS

2
Buena respuesta elaborada. Para VS2015 debe estar debajo de% ProgramFiles (x86)% \ Microsoft SDKs \ Windows \ v10.0A \ bin \ NETFX 4.6.1 Tools \ sn.exe
ThePatelGuy

1
La ruta VS2015 debe ser v10.0A, no V1.0A
Michael Itzoe

87

otra opción:

si usa PowerShell, puede averiguarlo como:

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

me gusta

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

y aparecerá como

MySql.Data, Versión = 6.6.5.0, Cultura = neutral, PublicKeyToken = c5687fc88969c44d


Impresionante, me permite copiar y pegar todo el resultado directamente en una configuración web si estoy agregando manualmente ensamblajes. ¡Gracias!
GJKH

Gran respuesta, ya que también puede obtener la versión (que puede ser importante para la resolución de problemas).
sbkrogers

48

Si la biblioteca está incluida en el proyecto VS, puede verificar el .cprojarchivo, por ejemplo:

<ItemGroup>
    <Reference Include="Microsoft.Dynamic, Version=1.1.0.20, Culture=neutral, PublicKeyToken=7f709c5b713576e1, processorArchitecture=MSIL">
...

2
Solo veo <Reference Include = "System.IdentityModel" /> (lo mismo para otros ensamblados)
FrenkyB

No parece ser muy útil para ensamblados en las bibliotecas del sistema .NET. por ejemplo, para System.Configuration solo dice<Reference Include="System.Configuration" />
Simon Tewsi

Parece que todos los ensamblajes tienen lo mismo PublicKeyToken, por lo que una búsqueda en el .cprojparece ser la solución más fácil.
asdf

14

Si ha incluido el ensamblaje en su proyecto, puede hacer lo siguiente:

            var assemblies =
                AppDomain.CurrentDomain.GetAssemblies();


            foreach (var assem in assemblies)
            {
                    Console.WriteLine(assem.FullName);
            }

no está obteniendo el token de clave pública de la dll en mis referencias. ¿Su método realmente obtiene todo el dll en las referencias de un determinado proyecto? gracias
Francis Saul

@FrancisSaul: solo enumerará los ensamblados que se CARGARON en la memoria de proceso de la aplicación; para ver detalles de un ensamblaje específico, primero ejecute el código que se refiere a algún tipo en ese ensamblaje. Por ejemplo, cree una nueva instancia de alguna clase en ese ensamblado.
ToolmakerSteve

Este fue el método más simple que funcionó para mí. Se puede simplificar aún más: ejecute la aplicación con un conjunto de puntos de interrupción. Cuando la ejecución se detiene en el punto de interrupción, en el tipo VS ventana Inmediato: AppDomain.CurrentDomain.GetAssemblies(). Esto enumerará los ensamblados cargados en la Ventana Inmediata, con Versión, Cultura y PublicKeyToken para cada uno.
Simon Tewsi

También es posible ejecutarlo en 'C # Interactive', ¡no es necesario compilarlo!
bTab

13

Puede obtener esto fácilmente a través de 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;
}

Intenté tu código pero no funciona. Quiero obtener el token de clave pública de Stimulsoft.Report.Web.dll que ya está en mis referencias. Copié su código y le pasé el nombre de la dll pero no funciona. Mi código es algo así: string s = GetPublicKeyTokenFromAssembly ("Stimulsoft.Report.Web"). Obviamente, el método está aceptando ensamblado, no un nombre de cadena. ¿Me pueden ayudar a usar su método?
Francis Saul

@FrancisSaul ¿Qué devuelve el método, "Ninguno" o un valor incorrecto? ¿Has determinado que la asamblea tiene un nombre fuerte? Puede verificar en VS en el panel de propiedades para la referencia (Nombre seguro). También puede verificar esto fácilmente con la mayoría de los descompiladores gratuitos como JustDecompile. Si ve que tiene un nombre seguro, depure el código e inspeccione los bytes.
Adam Caviness

No puedo ejecutar el proyecto, después de escribir la cadena de código s = GetPublicKeyTokenFromAssembly ("Stimulsoft.Report.Web"), dice que la mejor sobrecarga para el método tiene argumentos no válidos.
Francis Saul el

@FrancisSaul Estás pasando un argumento de cadena a un método que toma un ensamblado. Puede typeof(YourPreferredTypeInThatAssembly).Assemblyo Assembly.GetAssembly(typeof(YourPreferredTypeInThatAssembly))pasar eso al método si lo desea.
Adam Caviness

Entonces la sintaxis sería así. Assembly.GetAssembly (typeof ("Stimulsoft.Report.Web.dll));
Francis Saul

9

Puede agregar esto como una herramienta externa a Visual Studio de la siguiente manera:

Título:

Get PublicKeyToken

Mando:

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

(La ruta puede diferir entre versiones)

Argumentos:

-T "$(TargetPath)"

Y marque la opción " Usar ventana de salida ".


1
Cuando selecciona esto en el Toolsmenú, operará automáticamente en cualquier proyecto que haya seleccionado en el Explorador de soluciones.
Contango

Cambié el nombre de mi comando a Get PublicKeyToken on Solution Explorer Selection.
Contango

1
¡Buena respuesta! Sugerencia: si habilita la casilla de verificación "Solicitar argumentos", se abrirá un cuadro de diálogo que le permitirá pegar una ruta en él. Por lo tanto, podría copiar + pegar una ruta de ensamblaje desde la ventana de propiedades allí, por ejemplo. Eso fue muy útil para mí, especialmente cuando tuve que cambiar los registros en web.config y no conocía un token de clave pública de DLL.
Matt


5

1) El comando es C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\sn -T {your.dll}

En el ejemplo anterior, el SDK de Microsoft reside en C: \ Archivos de programa \ SDK de Microsoft \ Windows \ v6.0A. Su entorno puede diferir.

2) Para obtener el token de clave pública de cualquiera de sus proyectos, puede agregar sn.exe como parte de sus Herramientas externas en Visual Studio. Los pasos se muestran en este enlace de Microsoft: Cómo: Crear una herramienta para obtener la clave pública de un ensamblado


Sí, lo sé, estoy buscando una manera más fácil, preferiblemente sin salir de VS
moi_meme


5

Como alternativa, también puede usar linqasí:

    string key = string.Join ("",assembly
                                .GetName()
                                .GetPublicKeyToken()
                                .Select (b => b.ToString ("x2")));

1
Pidió el token de clave pública. Su código usa la clave pública. Debería ser.GetPublicKeyToken()
Stefan Born

1

Un método alternativo sería si tienes un descompilador, solo búscalo allí, generalmente proporcionan la clave pública. He mirado .Net Reflector, Telerik Just Decompile e ILSpy simplemente descompilan, parecen tener el token de clave pública que se muestra.


1

Otra opción es usar la herramienta de código abierto NuGet Package Explorer para esto.

Desde un paquete Nuget (.nupkg) puede verificar PublicKeyToken o arrastrar el binario (.dll) en la herramienta. Para este último seleccione primero "Archivo -> nuevo"

ingrese la descripción de la imagen aquí


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.