3

バイト配列を .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.WaitForDatapBuffer

原型に間違いはありませんか?バイト配列へのポインタはどのようにマーシャリングする必要がありますか?

4

1 に答える 1

3

そのようなポインターまたは「ダブルポインター」への参照を渡す必要があります

__declspec(dllexport) int WaitForData(unsigned char** pBuffer)

次に、ポインターの値を変更します(値で渡されるため)

*pBuffer = 'something'

その他のオプション - ポインターを返します (その後、int/length を別の方法で処理する必要があります)

ところで、自動生成されたプロトタイプがこのように見えるのはそのためです(out、ref修飾子はありません)

于 2012-04-17T11:12:45.360 に答える