由于工作需求,要把C++动态库里面的结构体数组通过参数传出来。网上也查了很多资料, 推荐一本书, 《精通.NET互操作:P/Invoke、C++ Interop和COM Interop》 , 介绍Windows平台上的托管代码与非托管代码之间进行互操作的各种技术, 虽然里面没有结构体数组的传参例子,但是原理懂了,自然也能写出来。
========================================================================
//C++代码
//要把一个数组传出去,就得传进数组的指针,
//把结构体数组传出去,需要传进来结构体指针的数组的指针
extern "C" __declspec(dllexport) void StructTest(AwardInfo*** pppdata, int* len)
{
int const count = 2;
AwardInfo** ppads = (AwardInfo**)malloc(sizeof(AwardInfo*)* count);
*len = 2;
*pppdata = ppads;
}
//C#代码
[DllImport(@"libTest.dll", EntryPoint = "StructAryTest")]
extern static void StructAryTest(out IntPtr ary, ref int len);
static void Main(string[] args)
{
int l = 0;
IntPtr adsAry;
StructAryTest(out adsAry, ref l);
IntPtr[] arrayptr = new IntPtr[l];
Marshal.Copy(adsAry, arrayptr, 0, l);
AwardInfo[] ads = new AwardInfo[l];
for (int i = 0; i < l; ++i )
{
ads[i] = (AwardInfo)Marshal.PtrToStructure(arrayptr[i], typeof(AwardInfo));
}
}
结构体传参,C++和C#两边都要定义相同结构体,书上都说得好清楚,
有一个地方要注意,在C++里面分配的内存,也要有一个接口让C#调用释放内存,要不然会造成内存泄漏。
其他一些互通的方式,数组传参,字符串传参,返回值等等,书上都有例子,这里不多写,忘记了就看看那书