Mam zestaw .NET (dll), który jest interfejsem API do tworzenia kopii zapasowych oprogramowania, którego tutaj używamy. Zawiera niektóre właściwości i metody, z których chciałbym skorzystać w moich skryptach Powershell. Mam jednak wiele problemów z pierwszym załadowaniem zestawu, a następnie użyciem dowolnego z typów po załadowaniu zestawu.
Pełna ścieżka do pliku to:
C:\rnd\CloudBerry.Backup.API.dll
W PowerShell używam:
$dllpath = "C:\rnd\CloudBerry.Backup.API.dll"
Add-Type -Path $dllpath
Otrzymuję błąd poniżej:
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.
Używanie tego samego polecenia cmdlet w innym zestawie .NET, DotNetZip , który ma przykłady użycia tej samej funkcjonalności na stronie, również dla mnie nie działa.
W końcu okazało się, że pozornie jestem w stanie załadować zestaw za pomocą odbicia:
[System.Reflection.Assembly]::LoadFrom($dllpath)
Chociaż nie rozumiem różnicy między metodami Load, LoadFrom lub LoadFile, ta ostatnia metoda wydaje się działać.
Jednak nadal nie mogę tworzyć instancji ani używać obiektów. Za każdym razem, gdy próbuję, pojawiają się błędy opisujące, że Powershell nie może znaleźć żadnego z typów publicznych.
Wiem, że są tam zajęcia:
$asm = [System.Reflection.Assembly]::LoadFrom($dllpath)
$cbbtypes = $asm.GetExportedTypes()
$cbbtypes | Get-Member -Static
---- początek fragmentu ----
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)
---- koniec fragmentu ----
Próba użycia metod statycznych kończy się niepowodzeniem, nie wiem dlaczego !!!
[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
Wszelkie wskazówki są mile widziane !!