J'ai un assemblage .NET (une dll) qui est une API pour sauvegarder le logiciel que nous utilisons ici. Il contient certaines propriétés et méthodes dont j'aimerais tirer parti dans mes scripts Powershell. Cependant, je rencontre beaucoup de problèmes avec le premier chargement de l'assemblage, puis l'utilisation de l'un des types une fois l'assemblage chargé.
Le chemin d'accès complet au fichier est:
C:\rnd\CloudBerry.Backup.API.dll
Dans Powershell, j'utilise:
$dllpath = "C:\rnd\CloudBerry.Backup.API.dll"
Add-Type -Path $dllpath
J'obtiens l'erreur ci-dessous:
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.
L'utilisation de la même applet de commande sur un autre assembly .NET, DotNetZip , qui contient des exemples d'utilisation des mêmes fonctionnalités sur le site, ne fonctionne pas non plus pour moi.
Je trouve finalement que je suis apparemment capable de charger l'assemblage en utilisant la réflexion:
[System.Reflection.Assembly]::LoadFrom($dllpath)
Bien que je ne comprenne pas la différence entre les méthodes Load, LoadFrom ou LoadFile, cette dernière méthode semble fonctionner.
Cependant, il me semble toujours impossible de créer des instances ou d'utiliser des objets. Chaque fois que j'essaye, j'obtiens des erreurs qui décrivent que Powershell est incapable de trouver l'un des types publics.
Je sais que les cours sont là:
$asm = [System.Reflection.Assembly]::LoadFrom($dllpath)
$cbbtypes = $asm.GetExportedTypes()
$cbbtypes | Get-Member -Static
---- début de l'extrait ----
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)
---- fin de l'extrait ----
Essayer d'utiliser des méthodes statiques échoue, je ne sais pas pourquoi !!!
[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
Toute orientation appréciée !!