DLLのマネージC#メソッドを呼び出すアンマネージC++関数があります。 C#メソッドの目的は、(C++呼び出し元によって割り当てられた)バイト配列を取得し、配列にデータを格納して戻すことです。配列をC#メソッドに入れることはできますが、データがC++関数に戻ったときにデータが失われてしまいます。今のところ、これは、プロセスをデバッグするために私のテストコードです:C++ <-->マーシャルされたバイトの配列を変更します。
C#DLL方法:
// Take an array of bytes and modify it
public ushort GetBytesFromBlaster([MarshalAs(UnmanagedType.LPArray)] byte[] dataBytes)
{
dataBytes[0] = (byte)'a';
dataBytes[1] = (byte)'b';
dataBytes[2] = (byte)'c';
return 3;
}
C++ DLLを呼び出す関数:
// bytes[] has been already allocated by its caller
short int SimGetBytesP2P(unsigned char bytes[])
{
unsigned short int numBytes = 0;
bytes[0] = 'x';
bytes[1] = 'y';
bytes[2] = 'z';
// bytes[] are {'x', 'y', 'z'} here
guiPtr->GetBytesFromBlaster(bytes, &numBytes);
// bytes[] SHOULD be {'a', 'b', 'c'} here, but they are still {'x', 'y', 'z'}
return(numBytes);
}
私はそれを信じますC + +ポインタを新しいマネージド配列に変換するのではなく、元のものを変更することです。私はいくつかのバリエーションを "ref"修正プログラムなどを使って試しましたが、運はありません。また、これらのデータはヌルで終了する文字列ではありません。日付バイトは生の1バイト値で、NULLで終了しません。
誰でもこの問題を解決できますか?ありがとう!
スチュアート
これはトリックでした!ありがとう、ジェームス! –