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

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

New-Object: не удается найти перегрузку для "X509Certificate2" и количество аргументов: "516" .

Ответы на вопрос(2)

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

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

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

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

 Svend04 сент. 2017 г., 13:46
То же самое, явно добавление типов ничего не делает. Проверяя выражение, содержащее байты, оно уже имеет тип byte [], а не object []. Использование Кит Хиллз предложение отлично работает.
 Andry21 мая 2013 г., 11:11
В моем случае я сделал строгий набор текста, но ничего ...
 x0n14 окт. 2012 г., 01:43
Строго вводя массив как [byte []] вместо нетипизированного (который на самом деле является [object []]), вы удаляете всю двусмысленность при выборе правильного конструктора. PowerShell будет искать конструктор при выполнении приведения, если не доступно явное или неявное приведение.
Решение Вопроса

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

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

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

Обновить: в PowerShell>= v5 вы можете вызвать конструктор напрямую так:

$cert = [System.Security.Cryptography.X509Certificates.X509Certificate]::new($bytes)
 mklement009 нояб. 2018 г., 17:02
Два придирки (и этовсе они есть)(, $bytes) достаточно для построения массива; в то время как@(...) в конечном итоге работает так же, это не является необходимым и менее эффективным, потому что это создаетдругой массив (хотя на практике это вряд ли будет иметь значение). Это не разрешение перегрузки конструктора, котороепроблема, но PowerShellстандартпривязка параметров:-ArgumentList является[object[]]типа, так что если вы передаете один аргумент, который является массивом (или подобным), этот массив 'элементы становятсяиндивидуальный аргументы для передачи конструктору; дополнительная оболочка массива избегает этого.

Ваш ответ на вопрос