Pregunta

Supongamos que quiero mostrar el nombre completo de un ensamblaje, dada solo una ruta al archivo de ensamblaje.

Sé que podría escribir un programa de línea de comandos o un script de PowerShell fácilmente, pero ¿el tiempo de ejecución incluye un comando que podría usar? (He visto a Gacutil hacerlo para ensambles que se encuentran en el GAC, pero sobre ensamblajes que no están registrados?)

¿Fue útil?

Solución

El principal problemático Parte de un nombre completo suele ser el token de clave pública. Puede obtenerlo ingresando esto en la ventana del símbolo del sistema Visual Studio:

sn -T path\to\your.dll

Sin embargo, personalmente, me resulta más fácil cargar la DLL en reflector. Eso muestra el nombre completo en el panel inferior.

Otros consejos

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 usando Assembly.Load, esto no cargará el ensamblaje en su AppDomain. Esto le permitirá obtener el nombre de ensamblaje para un ensamblaje sin tener que resolver las referencias que tiene el ensamblaje, y sin ejecutar ningún código (Constructores estáticos del módulo por ejemplo) en el ensamblaje. Incluso le permitirá obtener el nombre de ensamblaje de un ensamblaje que se dirige a una versión del marco .NET que difiere de la versión en la que se ejecuta su aplicación.

Puedes obtener esto a través de Nombre de ensamblaje:

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

Esto evita cargar realmente el ensamblaje en su proceso.

Para otra respuesta, puede hacer esto con PowerShell:

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

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

Es bastante fácil envolver eso en un script de cmdlet:

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

Process {
    $FullPath = [System.IO.Path]::GetFullPath($Path);
    return [System.Reflection.AssemblyName]::GetAssemblyName($FullPath).FullName;
}
System.Reflection.Assembly.GetExecutingAssembly().GetName().Name
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top