Kleine Tipps für Zwischendurch (Teil 14) – Auflisten aller geladenen Assembly-Bibliotheken

Die PowerShell basiert bekanntlich auf dem .NET-Framework und dessen Klassenbibliotheken, die auch Assemblies genannt werden. Unter diesem Gesichtspunkt betrachtet ist die PowerShell nichts anderes als ein Satz eigener Assembly-Bibliotheken, die in einer Anwendung, wie z.B. der Konsole, "gehostet" werden (wie sich die PowerShell-Bibliotheken z.B. in einer kleinen WinForms-Anwendung hosten lassen, wird an einem anschaulichen Praxisprojekt hier gezeigt  – ich finde es in Kursen immer wieder anschaulich zu zeigen, dass die PowerShell "in Wirklichkeit" nur ein Satz unscheinbarer Programmbibliotheken ist, die jeder Entwickler mit wenig Aufwand in seine eigenen Programme einbauen kann). Normalerweise muss man sich um die Assembly-Bibliotheken, die nach jedem Start der PowerShell geladen werden (mit der Version 2.0 "vorkompiliert", so dass das Laden nicht jedes Mal einige "kostbare" Sekunden in Anspruch nimmt) keine Gedanken machen – eine Ausnahme liegt immer dann vor, wenn eine .NET-Klassenfunktion aufgerufen werden soll, die in einer Assembly-Bibliothek enthalten ist, die noch nicht geladen wurde. Dann muss diese z.B. mit der LoadWithPartialName-Methode der Assembly-Klasse nachgeladen werden.

Der folgende Befehl listet die Namen aller aktuell geladenen Assembly-Bibliotheken auf:

[appdomain]::currentdomain.getassemblies()

Und hier die etwas "komfortablere"  Variante:

[appdomain]::currentdomain.getassemblies() | select @{name="Assembly-Name" ;Expression={$_.FullName.SubString(0,$_.FullName.IndexOf(",")) }}, @{name="Ort";Expression={$_.Location.SubString($_.Location.LastIndexOf("\")+1)}} | Sort "Assembly-Name"

Wer stört sich daran, dass manche Assembly-Namen mit einem Kleinbuchstaben beginnen? Die folgende Funktion wandelt den ersten Buchstaben eines übergebenen Strings in einen Großbuchstaben um und nutzt dabei die

function FirstCharToUpper() { ([string]$Args[0]).ToCharArray() | foreach -begin {$Anzahl=0;$Output=""} -process { $Anzahl++; if ($Anzahl-eq 1){$Output +=$_.ToString().ToUpper()}else {$Output+=$_} } -end { $Output } }

Und jetzt noch einmal der komplette Befehl:

[appdomain]::currentdomain.getassemblies() | select @{name="Assembly-Name";Expression={FirstCharToUpper($_.FullName.SubString(0,$_.FullName.IndexOf(",")))}}, @{name="Ort";Expression={$_.Location.SubString($_.Location.LastIndexOf("\")+1)}} | Sort "Assembly-Name"

PowerShellGeladeneAssemblies 
Abb. Die geladenen Assembly-Bibliotheken auf einen Blick

PS: Leider leiden die Einträge ein wenig darunter, dass sich die Befehle nicht direkt in die PowerShell-Konsole kopieren und ausführen lassen, was vermutlich an den speziellen Anführungszeichen und anderen Sonderzeichen liegt, die beim Copy&Paste eines Befehls mitkopiert werden. Ich bin generell ein wenig unzufrieden mit den Möglichkeiten, die WordPress in diesem Punkt bietet.

Advertisements

Kommentar verfassen

Bitte logge dich mit einer dieser Methoden ein, um deinen Kommentar zu veröffentlichen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s