Próbuję wywołać RNGCryptoServiceProvider-> GetBytes() z PHP przez warstwę COM. Mogę go podłączyć do klasy, ale za każdym razem, gdy wywołuję metodę, otrzymuję jeden z dwóch błędów (odnoszących się do parametru). Sądzę, że ma to coś z powodu faktu, że GetBytes pobiera macierz o stałej wielkości przez odniesienie. Ponieważ PHP nie obsługuje stałych rozmiarach sznurki, to gdzie robi się ciekawie:Wywołanie RNGCrypto z klasy DOTNET COM z PHP
Błąd 1:
$util = new \DOTNET(
'mscorlib',
'System.Security.Cryptography.RNGCryptoServiceProvider'
);
$data = new \Variant(str_repeat(chr(46), $size), VT_UI1 | VT_ARRAY);
$util->GetBytes($data);
Błąd [0x80070057] Parametr jest niepoprawny
Która jest wyrzucane przez linia ->GetBytes()
.
Jeśli nie używam wariantu, ale używam zwykłego łańcucha, nadal otrzymuję ten sam błąd.
Jednakże, jeśli przechodzą w tablicy tak:
$data = array('');
$util->GetBytes($data);
parametrów 0: Niezgodność typów.
Uważam, że podejście wariant/łańcuch jest poprawne (ponieważ przechodzi kontrolę typu parametru). Ale nie mogę pojąć, jak to działa.
C# interface to the method jest:
public override void GetBytes(
byte[] data
)
Dzięki
Może to nie jest rozwiązanie, którego szukasz, ale dlaczego nie utworzyć prostej usługi systemu Windows, która odbiera wszystko, co chcesz wysłać z PHP, a następnie po prostu zwróci wartość zakodowaną (czy wszystkie przetwarzanie w języku C#)? –
@GustavoRubio to jest do kodu biblioteki. Właściwie jest to część przenośnego PRNG, który próbuje wytwarzać silną losowość na wszystkich platformach. Więc usługi lub cokolwiek innego niż wywołania systemowe nie są naprawdę akceptowane (co robię). Miły pomysł jednak ... – ircmaxell