2011-09-08 22 views
5

Supongamos que deseo mostrar el nombre completo de un ensamblaje, dado solo una ruta al archivo de ensamblaje.obteniendo el nombre completo de un ensamblaje

Sé que podría escribir un programa de línea de comandos o una secuencia de comandos de powershell con la suficiente facilidad, pero ¿el motor de ejecución incluye un comando que podría usar? (He visto gacutil hacerlo por asambleas que se encuentran en el GAC, pero sobre los ensamblados que no están registrados?)

Respuesta

5

La principal problemática parte de un nombre completo es generalmente el símbolo de clave pública. Puede obtenerlo mediante la introducción de este en el Visual Studio ventana de comandos:

sn -T path\to\your.dll 

Personalmente, me resulta más fácil sólo para cargar el archivo DLL en el reflector, sin embargo. Eso muestra el nombre completo en el panel inferior.

+4

+1, para entender realmente lo que se pregunta aquí. –

+0

En lugar de cargarlo en el reflector, puede simplemente escribir una aplicación de consola: D – Jamiec

+1

@Jamiec seguro, pero tengo el reflector disponible. –

4

Usted puede conseguir esto a través de AssemblyName:

var name = AssemblyName.GetAssemblyName(path); 
var fullname = name.FullName; 

Esto evita efectivamente cargar el conjunto en tu proceso

+0

Lo sentimos, esto no es lo que estoy buscando. Sé cómo hacerlo en código. Lo que buscaba era una opción de línea de comando, porque tengo que enseñarle a una persona de apoyo cómo hacer esto. Tenía la esperanza de que hubiera un cmd incorporado que me diera lo que quería, y terminó haciendo lo mío. SIN EMBARGO, estaba usando Assembly.ReflectionLoadFrom(). Cambiaré para usar AssemblyName.GetAssemblyName +1 para la sugerencia de AssemblyName de todos modos. – JMarsch

0
System.Reflection.Assembly.GetExecutingAssembly().GetName().Name 
+0

Lo siento, esto no es lo que estoy buscando. Sé cómo hacerlo en código. Lo que buscaba era una opción de línea de comando, porque tengo que enseñarle a una persona de apoyo cómo hacer esto. Tenía la esperanza de que hubiera un cmd incorporado que me diera lo que quería, terminé rodando mi propio – JMarsch

17

creo que estás buscando System.Reflection.AssemblyName.GetAssemblyName:

AssemblyName name = AssemblyName.GetAssemblyName(@"C:\path\assembly.dll"); 
Console.WriteLine(name.FullName); 

A diferencia de la solución utilizando Assembly.Load, esto no va a cargar el conjunto en su dominio de aplicación. Esto le permitirá obtener AssemblyName para un ensamblaje sin tener que resolver las referencias que tenga el ensamblado, y sin ejecutar ningún código (por ejemplo, constructores estáticos de módulo) en el ensamblaje. Incluso le permitirá obtener el AssemblyName de un ensamblado que se dirige a una versión de .NET Framework que difiere de la versión en la que se ejecuta su aplicación.

+0

Lo siento, esto no es lo que estoy buscando. Sé cómo hacerlo en código.Lo que buscaba era una opción de línea de comando, porque tengo que enseñarle a una persona de apoyo cómo hacer esto. Tenía la esperanza de que hubiera un cmd incorporado que me diera lo que quería, y terminó haciendo lo mío. – JMarsch

+1

¡Puede que JMarsch no fuera lo que estaba buscando, pero era exactamente lo que yo quería! Gracias –

+1

Muy útil en combinación con 'Assembly.ReflectionOnlyLoad (...)' – marsze

1

Por otra respuesta, se puede hacer esto con PowerShell:

[System.Reflection.AssemblyName]::GetAssemblyName($PathToAssembly).FullName 

Esto tiene la ventaja de no necesitar tener instalado sólo para obtener sn.exe Visual Studio, y también que devuelve el nombre seguro completo para el conjunto en lugar de solo el token de clave pública.

Es bastante fácil para envolver que en un script cmdlet:

[CmdletBinding()] 
Param(
    [Parameter(Mandatory=$true,Position=0)] 
    $Path 
) 

Process { 
    $FullPath = [System.IO.Path]::GetFullPath($Path); 
    return [System.Reflection.AssemblyName]::GetAssemblyName($FullPath).FullName; 
} 
Cuestiones relacionadas