Ho un assembly .NET (una dll) che è un'API per il software di backup che utilizziamo qui. Contiene alcune proprietà e metodi che vorrei sfruttare nei miei script Powershell. Tuttavia, sto riscontrando molti problemi con il caricamento dapprima dell'assemblaggio, quindi utilizzando uno dei tipi una volta caricato l'assemblaggio.
Il percorso completo del file è:
C:\rnd\CloudBerry.Backup.API.dll
In Powershell utilizzo:
$dllpath = "C:\rnd\CloudBerry.Backup.API.dll"
Add-Type -Path $dllpath
Ricevo l'errore di seguito:
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.
Utilizzando lo stesso cmdlet su un altro assembly .NET, anche DotNetZip , che contiene esempi di utilizzo della stessa funzionalità sul sito, non funziona per me.
Alla fine trovo che sono apparentemente in grado di caricare l'assemblaggio usando la riflessione:
[System.Reflection.Assembly]::LoadFrom($dllpath)
Anche se non capisco la differenza tra i metodi Load, LoadFrom o LoadFile, sembra che l'ultimo metodo funzioni.
Tuttavia, mi sembra ancora impossibile creare istanze o utilizzare oggetti. Ogni volta che provo, ricevo errori che descrivono che Powershell non è in grado di trovare nessuno dei tipi pubblici.
So che le lezioni ci sono:
$asm = [System.Reflection.Assembly]::LoadFrom($dllpath)
$cbbtypes = $asm.GetExportedTypes()
$cbbtypes | Get-Member -Static
---- inizio estratto ----
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)
---- fine dell'estratto ----
Tentativo di utilizzare metodi statici non riesce, non so perché !!!
[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
Qualsiasi consiglio apprezzato !!