15

私は次のC++構造体を持っています

struct InnerStruct
{
   int A;
   int B;
};

struct OuterStruct
{
   int numberStructs;
   InnerStruct* innerStructs;
};

そしてC++関数

OuterStruct getStructs();

これをC#にマーシャリングするにはどうすればよいですか?C#の定義はどこにありますか

struct OuterStruct {
   InnerStruct[] innerStructs;
};
4

1 に答える 1

22

C++の戻り値からマーシャリングするデータの量をP/Invokeレイヤーに指示する方法がないため、これを手動で行う必要があります。

struct OuterStruct {
   int numberStructs;
   IntPtr innerStructs;
};

OuterStruct s = getStructs(); // using DllImport
var structSize = Marshal.SizeOf(typeof(InnerStruct));
var innerStructs = new List<InnerStruct>();
var ptr = s.innerStructs;

for (int i = 0; i < s.numberStructs; i++)
{
    innerStructs.Add((InnerStruct)Marshal.PtrToStructure(ptr, 
        typeof(InnerStruct));
    ptr = ptr + structSize;
}

C#コードからメモリを解放する場合は、C ++コードでinnerStructs標準のアロケータを使用する必要があります。その後、freeを呼び出すことができます。CoTaskMemAllocMarshal.CoTaskMemFreeinnerStructs

于 2009-07-28T23:15:42.043 に答える