Làm cách nào để thêm các cụm .NET vào phiên Powershell?


24

Tôi có một hội đồng .NET (một dll) là một API để sao lưu phần mềm chúng tôi sử dụng ở đây. Nó chứa một số thuộc tính và phương thức tôi muốn tận dụng trong tập lệnh Powershell của mình. Tuy nhiên, tôi đang gặp nhiều vấn đề với lần đầu tiên tải lắp ráp, sau đó sử dụng bất kỳ loại nào sau khi lắp ráp được tải.

Đường dẫn tệp hoàn chỉnh là:

C:\rnd\CloudBerry.Backup.API.dll

Trong Powershell tôi sử dụng:

$dllpath = "C:\rnd\CloudBerry.Backup.API.dll"
Add-Type -Path $dllpath

Tôi nhận được lỗi dưới đây:

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.

Sử dụng cùng một lệnh ghép ngắn trên một cụm .NET khác, DotNetZip , có các ví dụ về việc sử dụng cùng chức năng trên trang web cũng không hoạt động đối với tôi.

Cuối cùng tôi thấy rằng tôi dường như có thể tải lắp ráp bằng cách sử dụng sự phản chiếu:

[System.Reflection.Assembly]::LoadFrom($dllpath)

Mặc dù tôi không hiểu sự khác biệt giữa các phương thức Load, LoadFrom hoặc LoadFile mà phương thức cuối cùng có vẻ hoạt động.

Tuy nhiên, tôi dường như vẫn không thể tạo cá thể hoặc sử dụng các đối tượng. Mỗi lần tôi thử, tôi nhận được các lỗi mô tả rằng Powershell không thể tìm thấy bất kỳ loại nào.

Tôi biết các lớp học ở đó:

$asm = [System.Reflection.Assembly]::LoadFrom($dllpath)
$cbbtypes = $asm.GetExportedTypes()
$cbbtypes | Get-Member -Static

---- bắt đầu đoạn trích ----

   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)

---- kết thúc đoạn trích ----

Cố gắng sử dụng các phương thức tĩnh thất bại, tôi không biết tại sao !!!

[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

Bất kỳ hướng dẫn đánh giá cao !!

Câu trả lời:


15

Bạn có thể bao quanh Add-Typevới một lần thử và in thuộc tính LoaderExceptions không, vì lỗi này được nêu rõ. Nó có thể cung cấp một ngoại lệ với một thông báo lỗi chi tiết hơn.

try
{
    Add-Type -Path "C:\rnd\CloudBerry.Backup.API.dll"
}
catch
{
    $_.Exception.LoaderExceptions | %
    {
        Write-Error $_.Message
    }
}

9
Điều này không làm việc cho tôi, nhưng nó đã đưa tôi vào sân bóng. Bên trong phần bắt, đối tượng LoaderExceptions được đặt ở đây: $ _. Exception.LoaderExceptions
Brett

không có cách nào để sử dụng đường dẫn tương đối sao?
Amit

3

Tôi tìm thấy liên kết này: http://www.madwithpowershell.com/2013/10/add-type-vs-reflectionassinstall-in.html

Ông nói, ".LoadWithPartialName" đã không được chấp nhận. Do đó, thay vì tiếp tục triển khai Add-Type với phương thức đó, nó sử dụng bảng nội bộ tĩnh để dịch "tên một phần" thành "tên đầy đủ". Trong ví dụ được đưa ra trong câu hỏi, CloudBerry.Backup.API.dllkhông có mục trong bảng nội bộ của PowerShell, đó là lý do tại sao [System.Reflection.Assembly]::LoadFrom($dllpath)hoạt động. Nó không sử dụng bảng để tra cứu một phần tên.


2

Một số phương pháp ở trên không hiệu quả với tôi hoặc không rõ ràng.

Đây là những gì tôi sử dụng để bọc các cuộc gọi -AddPath và bắt LoaderExceptions:

try
{
   Add-Type -Path "C:\path\to.dll"
}
catch [System.Reflection.ReflectionTypeLoadException]
{
   Write-Host "Message: $($_.Exception.Message)"
   Write-Host "StackTrace: $($_.Exception.StackTrace)"
   Write-Host "LoaderExceptions: $($_.Exception.LoaderExceptions)"
}

Tham khảo
https://social.technet.microsoft.com/Forums/sharepoint/en-US/dff8487f-69af-4b64-ab83-13d58a55c523/addtype-inherribution-loaderexceptions


0

Tôi đã sử dụng thiết lập sau để tải một điều khiển csharp tùy chỉnh trong powershell. Nó cho phép điều khiển được tùy chỉnh và sử dụng từ bên trong powershell.

đây là liên kết blog

http://justcode.ca/wp/?p=435

và đây là liên kết mã với nguồn

http://www.codeproject.com/Articles/311705/Custom-CSharp-Control-for-Powershell


3
Chào mừng bạn đến với Lỗi Máy chủ! Chúng tôi thực sự thích câu trả lời chứa nội dung không phải con trỏ đến nội dung. Trong khi về mặt lý thuyết có thể trả lời câu hỏi, tốt hơn là nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo.
jscott

0

Các LoaderExceptionsđược ẩn bên trong bản ghi lỗi. Nếu lỗi loại bổ sung là lỗi cuối cùng trong danh sách lỗi, hãy sử dụng $Error[0].InnerException.LoaderExceptionsđể hiển thị lỗi. Nhiều khả năng, thư viện của bạn phụ thuộc vào thư viện khác chưa được tải. Bạn có thể chọn Add-Typetừng cái hoặc chỉ tạo một danh sách và sử dụng -ReferencedAssembliesđối số Add-Type.


Hãy thử $ Error [0] .Exception.LoaderExceptions và làm theo lời khuyên của Eris.
Tahir Hassan

-1

Tôi đoán bây giờ bạn MIGHT đã tìm thấy câu trả lời cho hiện tượng này. Tôi đã chạy theo bài đăng này sau khi gặp phải vấn đề tương tự ... Tôi có thể tải lắp ráp và xem các loại có trong lắp ráp, nhưng không thể kích hoạt một thể hiện của nó từ một lớp tĩnh. Có phải là EFTIDY. Tidy, EFTidyNet.TidyNet.Options hay gì? Ooooo Weeee ... Vấn đề ... vấn đề ... nó có thể là bất cứ điều gì. Và xem qua các phương thức tĩnh và các loại DLL không tiết lộ bất cứ điều gì hứa hẹn. Bây giờ tôi đã bị trầm cảm. Tôi đã có nó làm việc trong một chương trình C # được biên dịch, nhưng để sử dụng, tôi muốn nó chạy trong một ngôn ngữ xen kẽ ... powershell.

Giải pháp của tôi tôi đã tìm thấy và nó vẫn đang được chứng minh, nhưng tôi rất phấn khởi và muốn chia sẻ điều này. Xây dựng một ứng dụng console.exe nhỏ thực hiện func mà tôi quan tâm và sau đó xem nó trong một cái gì đó sẽ dịch ngược nó hoặc hiển thị mã IL. Tôi đã sử dụng gương phản xạ của Red-Gate và bổ trợ trình tạo ngôn ngữ powershell và Wallah! nó cho thấy chuỗi constructor thích hợp là gì! :-) Thử nó. và tôi hy vọng nó hoạt động cho bất cứ ai phải đối mặt với vấn đề này.


2
Và ... chuỗi constructor thích hợp là gì? Điều này không thực sự trả lời câu hỏi theo cách nó được viết. Ngoài ra, chào mừng bạn đến với ServerFault!
austinian
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.