web-dev-qa-db-fra.com

Comment appeler New-Object pour un constructeur qui prend un seul paramètre de tableau?

Dans PowerShell, je veux utiliser New-Object Pour appeler un constructeur .Net à un seul argument new X509Certificate2(byte[] byteArray). Le problème est que lorsque je fais cela avec un tableau d'octets de PowerShell, j'obtiens

New-Object: impossible de trouver une surcharge pour "X509Certificate2" et le nombre d'arguments: "516".

48
Tim Lovell-Smith

Cette approche de l'utilisation de new-object devrait marcher:

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

L'astuce est que PowerShell attend un tableau d'arguments constructeurs. Lorsqu'il n'y a qu'un seul argument et qu'il s'agit d'un tableau, il peut confondre l'algorithme de résolution de surcharge de PowerShell. Le code ci-dessus vous aide en mettant le tableau d'octets dans un tableau avec juste cet élément.

pdate: dans PowerShell> = v5, vous pouvez appeler le constructeur directement comme ceci:

$cert = [System.Security.Cryptography.X509Certificates.X509Certificate]::new($bytes)
61
Keith Hill

Étonnamment pour moi, j'ai essayé cela et il semble que cela fonctionne:

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

Je ne sais pas encore par quelle magie cela fonctionne, donc vos commentaires explicatifs sont appréciés. :)

(Remarque: depuis, j'ai constaté que l'utilisation du nom de type entre crochets comme je l'ai fait ci-dessus peut également entraîner d'autres erreurs, telles que "Impossible de convertir la valeur" System.Byte [] "en type" System.Security.Cryptography.X509Certificates .X509Certificate ". Erreur:" Impossible de trouver l'objet demandé. 'L'approche explicite de New-Object recommandée par Keith semble meilleure!)

10
Tim Lovell-Smith