Dev*_*Dev 14 .net c# pinvoke interop marshalling
我有以下C++结构
struct InnerStruct
{
int A;
int B;
};
struct OuterStruct
{
int numberStructs;
InnerStruct* innerStructs;
};
Run Code Online (Sandbox Code Playgroud)
还有一个C++函数
OuterStruct getStructs();
Run Code Online (Sandbox Code Playgroud)
我如何将其编组为C#?C#定义的位置
struct OuterStruct {
InnerStruct[] innerStructs;
};
Run Code Online (Sandbox Code Playgroud)
Ben*_*n M 22
您必须手动执行此操作,因为无法告诉P/Invoke层要从C++返回值编组多少数据.
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;
}
Run Code Online (Sandbox Code Playgroud)
请注意,如果innerStructs
要从C#代码中释放内存,则必须CoTaskMemAlloc
在C++代码中使用标准分配器- 然后您可以调用Marshal.CoTaskMemFree
free innerStructs
.