61

在 PowerShell 中,我想用来New-Object调用单参数 .Net 构造函数new X509Certificate2(byte[] byteArray)。问题是当我使用 powershell 中的字节数组执行此操作时,我得到

新对象:找不到“X509Certificate2”和参数计数的重载:“516”。

4

2 回答 2

75

这种使用方法new-object应该有效:

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

诀窍是 PowerShell 需要一组构造函数参数。当只有一个参数并且它是一个数组时,它会混淆 PowerShell 的重载解析算法。上面的代码通过将字节数组放入一个只有一个元素的数组中来帮助它。

更新:在 PowerShell >= v5 中,您可以像这样直接调用构造函数:

$cert = [System.Security.Cryptography.X509Certificates.X509Certificate]::new($bytes)
于 2012-10-13T17:31:21.273 回答
10

令我惊讶的是,我尝试了这个,它似乎有效:

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

我还不知道它有什么魔力,因此感谢您的解释性评论。:)

(注意:我发现像上面那样使用方括号类型名称也会导致其他错误,例如“无法将值“System.Byte []”转换为类型“System.Security.Cryptography.X509Certificates” .X509Certificate”。错误:“找不到请求的对象。” Keith 推荐的显式 New-Object 方法似乎更好!)

于 2012-10-13T05:15:48.723 回答