ฉันมี. NET assembly (dll) ซึ่งเป็น API สำหรับซอฟต์แวร์สำรองข้อมูลที่เราใช้ที่นี่ มันมีคุณสมบัติและวิธีการบางอย่างที่ฉันต้องการใช้ประโยชน์จากสคริปต์ Powershell ของฉัน อย่างไรก็ตามฉันพบปัญหามากมายกับการโหลดชุดประกอบครั้งแรกจากนั้นใช้ประเภทใดก็ได้เมื่อโหลดชุดประกอบแล้ว
เส้นทางไฟล์ที่สมบูรณ์คือ:
C:\rnd\CloudBerry.Backup.API.dll
ใน PowerShell ฉันใช้:
$dllpath = "C:\rnd\CloudBerry.Backup.API.dll"
Add-Type -Path $dllpath
ฉันได้รับข้อผิดพลาดด้านล่าง:
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.
การใช้ cmdlet เดียวกันกับแอสเซมบลี. NET อื่นDotNetZipซึ่งมีตัวอย่างของการใช้ฟังก์ชันการทำงานเดียวกันบนไซต์ก็ไม่ได้ผลสำหรับฉันเช่นกัน
ในที่สุดฉันก็พบว่าฉันสามารถโหลดชุดประกอบโดยใช้การสะท้อน:
[System.Reflection.Assembly]::LoadFrom($dllpath)
แม้ว่าฉันจะไม่เข้าใจความแตกต่างระหว่างวิธีการโหลด, LoadFrom หรือ LoadFile ที่วิธีสุดท้ายดูเหมือนว่าจะทำงาน
อย่างไรก็ตามฉันยังคงไม่สามารถสร้างอินสแตนซ์หรือใช้วัตถุได้ ทุกครั้งที่ฉันลองฉันพบข้อผิดพลาดที่อธิบายว่า Powershell ไม่สามารถค้นหาประเภทสาธารณะใด ๆ ได้
ฉันรู้ว่ามีชั้นเรียน:
$asm = [System.Reflection.Assembly]::LoadFrom($dllpath)
$cbbtypes = $asm.GetExportedTypes()
$cbbtypes | Get-Member -Static
---- start of excerpt ----
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)
---- จุดสิ้นสุดของข้อความที่ตัดตอนมา ----
การพยายามใช้วิธีการคงที่ล้มเหลวฉันไม่รู้ว่าทำไม !!!
[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
คำแนะนำใด ๆ ชื่นชม !!