C#调用C++DLL传递结构体数组的终极解决方案

在项目开发时,要调用C++封装的DLL,普通的类型C#上一般都对应,只要用DllImport传入从DLL中引入函数就可以了。但是当传递的是结构体、结构体数组或者结构体指针的时候,就会发现C#上没有类型可以对应。这时怎么办,第一反应是C#也定义结构体,然后当成参数传弟。然而,当我们定义完一个结构体后想传递参数进去时,会抛异常,或者是传入了结构体,但是返回值却不是我们想要的,经过调试跟踪后发现,那些值压根没有改变过,代码如下。

 [DllImport("workStation.dll")]
        private static extern bool fetchInfos(Info[] infos);
        public struct Info
        {
            public int OrderNO;

            public byte[] UniqueCode;

            public float CpuPercent;                  

        };
        private void buttonTest_Click(object sender, EventArgs e)
        {
            try
            {
		        Info[] infos=new Info[128];
                if (fetchInfos(infos))
                {
                    MessageBox.Show("Fail");
                }
		        else
		        {
                    string message = "";
                    foreach (Info info in infos)
                    {
                        message += string.Format("OrderNO={0}\r\nUniqueCode={1}\r\nCpu={2}",
                                               info.OrderNO,
                                               Encoding.UTF8.GetString(info.UniqueCode),
                                               info.CpuPercent
                                               );
                    }
                    MessageBox.Show(message);
		        }
            }
            catch (System.Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

后来,经过查找资料,有文提到对于C#是属于托管内存,现在要传递结构体数组,是属性非托管内存,必须要用Marsh指定空间,然后再传递。于是将结构体变
  • 25
    点赞
  • 145
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值