2009-04-08 22 views
8

私はC#で次のような構造をしました:C#で構造体の配列を整列する方法は?

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

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

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

しかし、データは戻っていません。私は既にPInvoke Interop Assistantを試しました。ここで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 
} 

答えて

13

私は遠くPからです/ Invokeエキスパートですが、イン/アウトパラメータを作成すると役立つかもしれません。

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

LayoutKind.Sequentialのように、私はが必要だと思っていますが、私はあなたの構造体がすでにblittable型であり、配列もblittableであることを願っています。

+0

これは、トリック、thxをしました。これらのキーワードが使用される他の場所はありますか?以前は見たことがありません – SDD

+1

MSDNから: [blittable型の配列を参照] ただし、これらの型は実際にはInパラメーターとしてマーシャリングされ、引数をマーシャリングする場合はInAttribute属性とOutAttribute属性を適用する必要がありますIn/Outパラメータ。 – SDD

+0

これは私のために働いてくれてありがとう - これを行うために2時間の苦労を終えた。 –