2013-08-28 33 views
10

Ich arbeite an einem PowerShell v3-Modul, das mit Typen arbeiten muss, die in einigen externen .NET-Assemblys enthalten sind.Wie verweise ich zuverlässig auf externe .NET-Assemblies in einem PowerShell v3-Modul?

Ich möchte, dass dieses Modul für eine einfache Bereitstellung einigermaßen eigenständig ist und ich möchte nicht, dass diese Baugruppen in den GAC geladen werden. Im Idealfall möchte ich die erforderlichen Assembly-DLLs im Modulordner ablegen und dann PowerShell verwenden, um diese Assemblys automatisch zu laden, wenn das Modul geladen wird.

Ich weiß, dass ich das Add-Type-Befehl an Brute-Force laden die Baugruppen wie so verwenden:

Add-Type -AssemblyName "Some.Assembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=sometoken" 

Aber ich habe alse lesen über die erforderlichen Baugruppen Eigenschaft in einem Modul manifestieren und ich bin zuversichtlich, dass

# Assemblies that must be loaded prior to importing this module 
# RequiredAssemblies = @() 

Was ist der zuverlässigste Weg, um die externen Baugruppen innerhalb des Moduls zu verweisen: dieser Ansatz könnte den scheinbar fragilen Add-Type Code beseitigen? Würde das Deklarieren der Abhängigkeit im Manifest die Assemblys implizit laden, wenn das Modul geladen wird? Wenn ich das Manifest des Moduls nutzen würde, um die benötigten Assemblies aufzulisten, müsste ich dann Code schreiben, der die Assemblys lädt?

Ich bin wirklich nicht auf der Suche nach einer einfachen "Get it to work" -Lösung, wie ich bereits mit dem Add-Type-Ansatz arbeiten ... Ich suche nach Leitlinien und Empfehlungen für die zuverlässigste Art und Weise zu tun Dies.

Antwort

10

Die New-ModuleManifest Dokumentation für seine -RequiredAssemblies Parameter stimmt zu:

Gibt die Assembly (DLL) Dateien, die das Modul benötigt. Geben Sie die Dateinamen der Assembly ein. Windows Powershell lädt die angegebenen Baugruppen vor Typen oder Formate importieren verschachtelte Module oder den Import die Moduldatei zu aktualisieren, die in dem Wert des RootModule Schlüssels angegeben ist.

Verwenden Sie diesen Parameter alle Baugruppen aufzulisten, die das Modul, einschließlich Baugruppen erfordert, die geladen werden müssen alle Formatierungen zu aktualisieren oder Dateien geben, die in den FormatsToProcess oder TypesToProcess Tasten

Und ich kann nicht alles aufgelistet finden anders (zB auf MSDN).

+0

Wissen Sie, wie Sie die Baugruppen in dieser Eigenschaft zuverlässig auflisten? Wenn ich vollständig qualifizierte Namen verwendet und die Assembly-DLL in den Ordner des Moduls gelegt habe, reicht das aus oder müsste ich einen Pfad angeben? Wo sucht der Bestückungslader nach diesen Baugruppen? – syneptody

+0

@syneptody Die Laderegeln auf [MSDN] dokumentiert sind (http://msdn.microsoft.com/en-us/library/yx7xezcf%28v=vs.100%29.aspx): Ich glaube nicht, PSH etwas tut ganz besonders, abgesehen davon, dass Sie das Verzeichnis des Moduls zu diesem Suchpfad hinzufügen. Vielleicht folgt ein Beispiel (wie [PSCX] (http://pscx.codeplex.com/))? – Richard

+0

@syneptody Aus meiner Nutzung habe ich den Namen der Assembly in der PSD1 Datei, wobei die Anordnung im gleichen Verzeichnis des Skripts und es funktioniert ohne Probleme. Zum Beispiel 'RequiredAssemblies = @ ('IHE.CDA.Generation.Trifolia')' – Tedford