Domanda

Supponiamo di voler visualizzare il nome completo di un assembly, dato solo un percorso al file di assemblaggio.

So che potrei scrivere un programma di riga di comando o uno script PowerShell abbastanza facilmente, ma il runtime include un comando che potrei usare? (Ho visto Gacutil farlo per gli assembly che sono nel GAC, ma per le assemblee che non sono registrate?)

È stato utile?

Soluzione

Il principale problematico Parte di un nome completo è di solito il token della chiave pubblica. È possibile ottenerlo inserendolo nella finestra Prompt dei comandi Visual Studio:

sn -T path\to\your.dll

Personalmente, trovo più facile solo caricare la DLL in Riflettore. Questo mostra il nome completo nel pannello inferiore.

Altri suggerimenti

Penso che tu stia cercando System.reflection.assemblyname.getassemblyname:

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

A differenza della soluzione utilizzando Assembly.load, questo non caricherà l'assembly nel tuo appdomain. Ciò consentirà di ottenere il nome assembly per un assembly senza dover risolvere alcun riferimento che l'assemblaggio ha e senza eseguire alcun codice (EG Module Static Constructors) nell'assemblaggio. Ti permetterà anche di ottenere il nome assembly di un assembly che mira a una versione del framework .NET che differisce dalla versione su cui è in esecuzione l'applicazione.

Puoi ottenerlo tramite AssemblyName:

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

Questo evita effettivamente di caricare l'assemblaggio nel processo.

Per un'altra risposta, puoi farlo con PowerShell:

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

Questo ha il vantaggio di non aver bisogno di installare Visual Studio solo per ottenere sn.exe, e anche che restituisce il nome completo per l'Assemblea piuttosto che solo il token della chiave pubblica.

È abbastanza facile avvolgerlo in uno script 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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top