1

C#を使用してアンマネージコードを呼び出そうとしています。

extern "C" __declspec(dllexport) LPBYTE DataReceived(LPBYTE signals)
{
   LPBYTE test;
   *(WORD*)(test) = 0x0C;
   *(WORD*)(test + 2) = 0x1000;

   return test;
   // I even tried returning 0x00 only; and I was still getting the exception

}

C#コード

internal sealed class Test
{
    [DllImport("testlib.dll", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
    public static extern byte[] DataReceived(byte[] signals);

}

// signals is byte[] too
byte[] foo = Test.DataReceived(signals);

//exception that occurs 
 A first chance exception of type 'System.Runtime.InteropServices.MarshalDirectiveException

私はint値をうまく返す別の関数を持っています、それはLPBYTE自体に関連していると思います。助けに感謝します。

4

4 に答える 4

3

私はあなたが使いたいと信じています

internal sealed class Test
{
    [DllImport("testlib.dll", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
    public static extern IntPtr DataReceived(byte[] signals);

}

これを呼び出すときはMarshall.Copy、データを取得するために を使用する必要がありますが、これにはデータの長さを知っている必要があることに注意してください。

IntPtr fooPtr = Test.DataRecieved(signals);
var foo = new byte[LENGTH];
Marshall.Copy(fooPtr, foo, 0, LENGTH);
于 2010-12-09T00:24:11.707 に答える
0

アダム・ネイサンズの本はこれに関するバイブルです

待ってください: この関数の戻り値は正確には何ですか? 何へのポインタですか?

テストはランダムなアドレスを指し、次にテストが指すデータを突く

何を返したいですか?

ポインタを返す必要がある場合は、intptr を返すように関数を宣言してから、Marshall を呼び出してバイトをコピーします。次に、返されたバッファを解放する必要があるかどうかを決定する必要があります

于 2010-12-09T00:18:55.810 に答える
0

.NET マーシャラーは、返された配列からマネージ配列インスタンスにコピーする必要があるデータの量をどのように知る必要がありますか?

IntPtras resultを試して受け入れてから、Marshalクラスを使用してデータをコピーすることをお勧めします。

于 2010-12-09T00:19:10.427 に答える
0

ここで pinvoke 相互運用アシスタントを確認してください。

http://clrinterop.codeplex.com/

pinvoke 署名が自動的に生成されます。

于 2010-12-09T00:24:32.737 に答える