Eu tenho um assembly .NET (uma dll) que é uma API para fazer backup do software que usamos aqui. Ele contém algumas propriedades e métodos dos quais gostaria de aproveitar meus scripts do Powershell. No entanto, estou enfrentando muitos problemas ao carregar primeiro o assembly e depois usar qualquer um dos tipos depois que o assembly é carregado.
O caminho completo do arquivo é:
C:\rnd\CloudBerry.Backup.API.dll
No Powershell eu uso:
$dllpath = "C:\rnd\CloudBerry.Backup.API.dll"
Add-Type -Path $dllpath
Eu recebo o erro abaixo:
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.
Usar o mesmo cmdlet em outro assembly .NET, DotNetZip , que tem exemplos de uso da mesma funcionalidade no site, também não funciona para mim.
Eventualmente, acho que sou capaz de carregar o assembly usando a reflexão:
[System.Reflection.Assembly]::LoadFrom($dllpath)
Embora eu não entenda a diferença entre os métodos Load, LoadFrom ou LoadFile, esse último método parece funcionar.
No entanto, ainda pareço incapaz de criar instâncias ou usar objetos. Cada vez que tento, recebo erros que descrevem que o Powershell não consegue encontrar nenhum dos tipos públicos.
Eu sei que as aulas estão lá:
$asm = [System.Reflection.Assembly]::LoadFrom($dllpath)
$cbbtypes = $asm.GetExportedTypes()
$cbbtypes | Get-Member -Static
---- início do trecho ----
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)
---- fim do trecho ----
Tentando usar métodos estáticos falham, não sei por que !!!
[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
Qualquer orientação apreciada !!