Question

Supposons que je veuille afficher le nom complet d'un ensemble, étant donné qu'un chemin vers le fichier d'assemblage.

Je sais que je pourrais écrire un programme de ligne de commande ou d'un script Powershell assez facilement, mais est-ce le temps d'exécution inclure une commande que je pourrais utiliser? (Je l'ai vu GACUtil le faire pour les assemblées qui sont gac, mais sur les assemblées qui ne sont pas enregistrés?)

Était-ce utile?

La solution

La principale problématique une partie d'un nom complet est généralement le jeton de clé publique. Vous pouvez l'obtenir en entrant dans la commande Visual Studio fenêtre d'invite:

sn -T path\to\your.dll

Personnellement, je trouve qu'il est plus facile de charger le dll dans le réflecteur, cependant. Cela montre le nom complet dans le panneau inférieur.

Autres conseils

Je pense que vous êtes à la recherche System.Reflection.AssemblyName.GetAssemblyName:

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

Contrairement à la solution à l'aide Assembly.Load, ce ne sera pas charger l'ensemble dans votre AppDomain. Cela vous permettra d'obtenir le AssemblyName pour un ensemble sans avoir à résoudre toutes les références qui a l'assemblage, et sans exécuter de code (par exemple module constructeurs statiques) dans l'assemblage. Il va même vous permettre d'obtenir le AssemblyName d'un ensemble qui cible une version du .NET Framework qui diffère de la version sur laquelle est en cours d'exécution de votre application.

Vous pouvez obtenir ce via AssemblyName :

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

On évite ainsi le chargement en fait l'assemblage dans votre processus.

Pour une autre réponse, vous pouvez le faire avec PowerShell:

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

Ceci a l'avantage de ne pas avoir besoin d'avoir installé Visual Studio juste pour obtenir sn.exe, et aussi qu'il retourne le nom fort complet pour l'assemblée plutôt que le jeton de clé publique.

Il est assez facile d'envelopper que dans 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;
}
System.Reflection.Assembly.GetExecutingAssembly().GetName().Name
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top