我试图通过COM层从PHP调用RNGCryptoServiceProvider-> GetBytes()。我可以让它连接到类,但每次调用方法时,我都会得到两个错误之一(与参数有关)。我认为GetBytes通过引用采用固定大小的字节数组这一事实是有原因的。由于PHP不支持固定大小的字符串,因此它很有趣:
错误1:
$util = new \DOTNET(
'mscorlib',
'System.Security.Cryptography.RNGCryptoServiceProvider'
);
$data = new \Variant(str_repeat(chr(46), $size), VT_UI1 | VT_ARRAY);
$util->GetBytes($data);
错误[0x80070057]参数不正确
由->GetBytes()
行抛出。
如果我不使用变体,但只使用普通字符串,我仍会得到同样的错误。
但是,如果我传入一个这样的数组:
$data = array('');
$util->GetBytes($data);
参数0:类型不匹配。
所以我认为变量/字符串方法是正确的(因为它传递参数类型检查)。但我无法弄清楚如何让它发挥作用。
public override void GetBytes(
byte[] data
)
由于
答案 0 :(得分:3)
自从我接触PHP以来,已经有好几年了,更不用说尝试与.net进行互操作了,但是如果你创建一个填充到你想要的长度的字符串并解压缩()呢?
$byte_array = unpack('C*', '12345678');
$util->GetBytes($byte_array);
Whelp,浪费了一两个小时玩它没有结果。我来看看这个:
有两个合理的选项 - 构建一个简单的包装器,这样你就可以调用无参数方法,或者使用内置和跨平台的东西。