Ich habe eine .NET-Assembly (eine DLL), die eine API für die hier verwendete Sicherungssoftware ist. Es enthält einige Eigenschaften und Methoden, die ich in meinen Powershell-Skripten verwenden möchte. Es treten jedoch viele Probleme auf, wenn ich erst die Assembly lade und dann einen der Typen verwende, sobald die Assembly geladen ist.
Der vollständige Dateipfad lautet:
C:\rnd\CloudBerry.Backup.API.dll
In Powershell verwende ich:
$dllpath = "C:\rnd\CloudBerry.Backup.API.dll"
Add-Type -Path $dllpath
Ich erhalte den folgenden Fehler:
Add-Type : Unable to load one or more of the requested types. Retrieve the
LoaderExceptions property for more information.
At line:1 char:9
+ Add-Type <<<< -Path $dllpath
+ CategoryInfo : NotSpecified: (:) [Add-Type], ReflectionTypeLoadException
+ FullyQualifiedErrorId : System.Reflection.ReflectionTypeLoadException,Microsoft.PowerShell.Commands.AddTypeComma
ndAdd-Type : Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.
Die Verwendung desselben Cmdlets in einer anderen .NET-Assembly, DotNetZip , mit Beispielen für die Verwendung derselben Funktionalität auf der Site, funktioniert bei mir ebenfalls nicht.
Irgendwann stelle ich fest, dass ich die Assembly scheinbar mithilfe von Reflektion laden kann:
[System.Reflection.Assembly]::LoadFrom($dllpath)
Obwohl ich den Unterschied zwischen den Methoden Load, LoadFrom oder LoadFile nicht verstehe, scheint diese letzte Methode zu funktionieren.
Es scheint mir jedoch immer noch nicht möglich zu sein, Instanzen zu erstellen oder Objekte zu verwenden. Bei jedem Versuch erhalte ich Fehler, die beschreiben, dass Powershell keinen der öffentlichen Typen finden kann.
Ich weiß, dass der Unterricht dort ist:
$asm = [System.Reflection.Assembly]::LoadFrom($dllpath)
$cbbtypes = $asm.GetExportedTypes()
$cbbtypes | Get-Member -Static
---- Auszugsbeginn ----
TypeName: CloudBerryLab.Backup.API.BackupProvider
Name MemberType Definition
---- ---------- ----------
PlanChanged Event System.EventHandler`1[CloudBerryLab.Backup.API.Utils.ChangedEventArgs] PlanChanged(Sy...
PlanRemoved Event System.EventHandler`1[CloudBerryLab.Backup.API.Utils.PlanRemoveEventArgs] PlanRemoved...
CalculateFolderSize Method static long CalculateFolderSize()
Equals Method static bool Equals(System.Object objA, System.Object objB)
GetAccounts Method static CloudBerryLab.Backup.API.Account[], CloudBerry.Backup.API, Version=1.0.0.1, Cu...
GetBackupPlans Method static CloudBerryLab.Backup.API.BackupPlan[], CloudBerry.Backup.API, Version=1.0.0.1,...
ReferenceEquals Method static bool ReferenceEquals(System.Object objA, System.Object objB)
SetProfilePath Method static System.Void SetProfilePath(string profilePath)
---- Ende des Ausschnitts ----
Der Versuch, statische Methoden zu verwenden, schlägt fehl, ich weiß nicht warum !!!
[CloudBerryLab.Backup.API.BackupProvider]::GetAccounts()
Unable to find type [CloudBerryLab.Backup.API.BackupProvider]: make sure that the assembly containing this type is load
ed.
At line:1 char:42
+ [CloudBerryLab.Backup.API.BackupProvider] <<<< ::GetAccounts()
+ CategoryInfo : InvalidOperation: (CloudBerryLab.Backup.API.BackupProvider:String) [], RuntimeException
+ FullyQualifiedErrorId : TypeNotFound
Jede Anleitung wird gebeten !!