10

私はC#で次の構造を持っています:

[StructLayoutAttribute(LayoutKind.Sequential)]
public struct RECORD
{
    public uint m1;
    public uint m2;
    public uint m3;
}

これらの構造体の配列(固定長)をネイティブコードに渡す必要があります。ネイティブコードは、これらの構造体にデータを書き込みます。配列はC#で割り当てられ、Cdllに渡されます。インポートした関数を次のように宣言しました。

[DllImport("marshall.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern void doIt(RECORD[] dataRecord);

しかし、私はデータを取り戻しません。私はすでにPInvokeInteropAssistantを試しました。ここでIntPtrを使用する必要がありますか?何か案は?

編集:

ネイティブ関数を呼び出すためのC#コードは次のとおりです。

RECORD[] rec = new RECORD[256];
doIt(rec);
// values of rec are all zero here

C関数は次のとおりです。

int doIt(RECORD* rec)
{
    // deref pointer and write some data
}
4

1 に答える 1

14

私はP/Invokeの専門家からはほど遠いですが、それをin/outパラメーターにすることが役立つのではないかと思います。

DllImport("marshall.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern void doIt([In, Out] RECORD[] dataRecord);

ただし、構造体がすでにブリット可能タイプであり、配列もブリット可能であることを期待しているので、それが必要になるとLayoutKind.Sequentialは思っていませんでした。

于 2009-04-08T11:31:26.223 に答える