バイト配列を .NET ラッパーに配信する必要があるネイティブ メソッドがあります。natove メソッドは次のようになります。
__declspec(dllexport) int WaitForData(unsigned char* pBuffer)
{
return GetData(pBuffer);
}
GetData は、malloc を使用してメモリ領域を割り当て、一部のデータ (バイト ストリーム) をそこにコピーします。このバイト ストリームは、ソケット接続を介して受信されました。戻り値は pBuffer の長さです。
このメソッドは、.NET から呼び出す必要があります。インポート宣言は次のようになります。
[DllImport("CommunicationProxy.dll")]
public static extern int WaitForData(IntPtr buffer);
[編集]
dasblinkenlight がアドバイスした P/Invoke Interop Assistant は、プロトタイプを次のインポート シグネチャに変換します。
public static extern int WaitForData(System.IntPtr pBuffer)
結果は同じです。メソッドを呼び出した後、ptr は 0 です。
[/編集]
メソッドが呼び出された後、結果が抽出されます。
IntPtr ptr = new IntPtr();
int length = Wrapper.WaitForData(ref ptr);
byte[] buffer = new byte[length];
for(int i = 0;i<length;i++)
{
buffer[i] = System.Runtime.InteropServices.Marshal.ReadByte(ptr, i);
}
Wrapper.FreeMemory(ptr);
問題は、ネイティブ変数 pBuffer に含まれる値が管理変数 ptr に含まれていないことです。割り当てられたメモリ領域を指していても、戻るptr
ときは常に 0です。Wrapper.WaitForData
pBuffer
原型に間違いはありませんか?バイト配列へのポインタはどのようにマーシャリングする必要がありますか?