Подтвердить что ты не робот

Как я могу вызвать New-Object для конструктора, который принимает один параметр массива?

В PowerShell я хочу использовать New-Object для вызова конструктора .Net-конструктора с одним аргументом new X509Certificate2(byte[] byteArray). Проблема в том, что когда я делаю это с байтовым массивом из powershell, я получаю

Новый объект: не удается найти перегрузку для "X509Certificate2" и количество аргументов: "516".

4b9b3361

Ответ 1

Этот подход к использованию new-object должен работать:

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

Фокус в том, что PowerShell ожидает массив аргументов конструктора. Когда есть только один аргумент, и это массив, он может запутать алгоритм разрешения перегрузки PowerShell. Вышеприведенный код помогает, поместив массив байтов в массив только с одним элементом.

Ответ 2

Удивительно, но я попробовал это, и кажется, что это работает:

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

Я еще не знаю, с какой магией он работает, поэтому ваши пояснительные комментарии оценены.:)

(Примечание. Я обнаружил, что использование типа квадратных скобок-типа-типа, как я уже говорил выше, также может привести к другим ошибкам, таким как "Невозможно преобразовать значение" System.Byte [] ", чтобы ввести" System.Security. Cryptography.X509Certificates.X509Certificate ". Ошибка:" Не удается найти запрошенный объект". Явный подход New-Object, рекомендованный Кейтом, выглядит лучше!)