2012-10-13 47 views

Trả lời

49

cách tiếp cận này để sử dụng new-object nên làm việc:.!

$cert = new-object System.Security.Cryptography.X509Certificates.X509Certificate ` 
     -ArgumentList @(,$bytes) 

Bí quyết là PowerShell đang mong đợi một mảng các đối số hàm tạo. Khi chỉ có một đối số và nó là một mảng, nó có thể gây nhầm lẫn cho thuật toán phân giải quá tải của PowerShell. Đoạn mã trên giúp nó bằng cách đặt mảng byte trong một mảng chỉ với một phần tử đó.

7

Đáng ngạc nhiên với tôi, tôi đã cố gắng này và có vẻ như nó hoạt động:

[byte[]] $certPublicBytes = something 
$cert = [System.Security.Cryptography.X509Certificates.X509Certificate] $certPublicBytes 
return $cert 

Tôi chưa biết bằng cách ma thuật nó hoạt động như thế nào, vì vậy nhận xét giải thích của bạn được đánh giá cao. :)

(Lưu ý: Vì tôi thấy rằng sử dụng tên dấu ngoặc vuông như tôi đã làm ở trên, cũng có thể dẫn đến các lỗi khác, chẳng hạn như 'Không thể chuyển đổi giá trị' System.Byte [] "thành loại" Hệ thống .Security.Cryptography.X509Certificates.X509Certificate "Lỗi: " không thể tìm thấy đối tượng yêu cầu 'The rõ ràng cách tiếp cận New-Object khuyến cáo của Keith có vẻ tốt hơn)

+6

Bằng cách nhập mạnh mảng dưới dạng [byte []] thay vì không được nhập (mà thực sự là [đối tượng []]), bạn sẽ loại bỏ tất cả sự mơ hồ khi chọn đúng hàm tạo. PowerShell sẽ tìm kiếm một hàm tạo khi thực hiện một dàn diễn viên nếu không có diễn viên tiềm ẩn hoặc rõ ràng. – x0n

+0

Trong trường hợp của tôi, tôi đã gõ mạnh mẽ nhưng không có gì ... – Andry

+0

Tương tự, rõ ràng thêm các loại không có gì. Kiểm tra biểu thức chứa các byte, nó đã có kiểu byte [] và không phải là đối tượng []. Sử dụng đề xuất Keith Hills hoạt động tốt. – Svend

Các vấn đề liên quan