结构体数组作为传出参数从C++封送到C#

由于工作需求,要把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#调用释放内存,要不然会造成内存泄漏。
    其他一些互通的方式,数组传参,字符串传参,返回值等等,书上都有例子,这里不多写,忘记了就看看那书
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值