我正试图通过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:类型不匹配。
因此,我认为variable/string方法是正确的(因为它通过了参数类型检查)。但我就是不知道如何让它发挥作用。
方法的C#接口是:
public override void GetBytes(
byte[] data
)
感谢
我接触PHP已经好几年了,更不用说尝试与.net进行互操作了,但如果您创建一个填充到所需长度的字符串并将其解包(),该怎么办?
$byte_array = unpack('C*', '12345678');
$util->GetBytes($byte_array);
哎呀,浪费了一两个小时玩,结果没有结果。我会看看这个:
http://www.sitepoint.com/forums/showthread.php?766246-使用DOTNET类生成PHP和NET安全RndNum
有两个合理的选择——构建某种简单的包装器,这样你就可以调用一个无参数的方法,或者使用内置的跨平台方法。