Frage

Angenommen, ich möchte den vollständigen Namen einer Baugruppe anzeigen, nur einen Pfad zur Montagedatei.

Ich weiß, dass ich leicht ein Befehlszeilenprogramm oder ein PowerShell -Skript schreiben könnte, aber enthält die Laufzeit einen Befehl, den ich verwenden könnte? (Ich habe gesehen, wie Gacutil es für Versammlungen getan hat, die im GAC sind, aber über Versammlungen, die nicht registriert sind?)

War es hilfreich?

Lösung

Die Hauptstufe problematisch Ein Teil eines Vollnamens ist normalerweise das öffentliche Schlüsselmarke. Sie können es erhalten, indem Sie dies in das Fenster "Visual Studio COMPLIT Eingabeaufforderung" eingeben:

sn -T path\to\your.dll

Persönlich finde ich es jedoch einfacher, die DLL in Reflektor zu laden. Dies zeigt den vollständigen Namen im unteren Feld.

Andere Tipps

Ich denke, Sie suchen nach System.reflection.assemblyName.GetAssemblyName:

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

Im Gegensatz zur Lösung unter Verwendung der Montage.LOAD wird die Baugruppe nicht in Ihre AppDomain geladen. Auf diese Weise können Sie den AssemblyName für eine Baugruppe erhalten, ohne alle Referenzen, die die Baugruppe hat, und ohne Code (z. B. statische Konstrukteure) in der Baugruppe auszuführen. Sie können sogar den AssemblyName einer Baugruppe erhalten, die auf eine Version des .NET -Frameworks abzielt, die sich von der Version unterscheidet, auf der Ihre Anwendung ausgeführt wird.

Sie können das über durch AssemblyName:

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

Dies vermeidet das Laden der Baugruppe in Ihren Prozess.

Für eine weitere Antwort können Sie dies mit PowerShell tun:

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

Dies hat den Vorteil, dass Visual Studio nicht installiert werden muss, um nur zu bekommen sn.exe, und auch, dass es den vollständigen starken Namen für die Versammlung und nicht nur für das öffentliche Schlüssel -Token zurückgibt.

Es ist einfach genug, das in ein CMDLet -Skript zu wickeln:

[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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top