質問: (struct_D)Marshal.PtrToStructure(ptrdataOut[ii], typeof(struct_D)); Marshal.FreeHGlobal(ptrdataOut[ii]); } } } ``` <B.dll(呼び出し先)> ``` // C#受渡し用構造体 struct gyddwsproduct { long val1; // 値1 char val2[16]; // 値2(値が省略("")の可能性あり) char val3[60]; // 値3 } // 関数1(配列サイズ取得関数)←こちらは問題なく動作する DLLEXPORT int __stdcall GetTotal(int* Total) { ... } // 関数2(構造体配列の取得関数) DLLEXPORT int __stdcall Func_C(struct_D* dataOut, int num, struct_D dataIn) { ... // 入力引数(num, dataInは問題なく取得できている) } ```
回答: ``` // アンマネージなメモリサイズ1個分 var size = Marshal.SizeOf(typeof(struct_D)); IntPtr ptr = Marshal.AllocHGlobal( size * Total); //略 (Marshal.Copyはいらない) //受け取り struct_D[] dataOut = new struct_D[Total]; for ( int i = 0; i < Total; ++i) { //メモリずらしながら1個ずつ取り出す struct_D pp = (struct_D)Marshal.PtrToStructure(ptr + (size*i), typeof(struct_D)); dataOut[i] = pp; } Marshal.FreeHGlobal(ptr); ``` 実際に動作させていませんが、こんな受け取り方でいけるはず