一个客户要使用C#调用我们用C++开发的一个动态链接库,本来我没有C#的开发经验,就随便写了一个例程。以为很简单就可以搞定,没想到客户开发的过程中遇到了不少问题,最困难的就是用C#调用C++接口中的自定义数据类型的数组作为参数的情况了,解决完问题,总结如下。

DLL接口定义如下:

这里pDinCanInfo是有3个DINCAN_INFO元素数组的指针,其中ReadDinCanInfo中的pDinCanInfo需要作为out参数,WriteDinCanInfo需要作为In参数,这两种使用形式在C#中的调用方法也不太一样。

C#调用ReadDinCanInfo关键代码如下:

DINCAN_INFO DinInfo = new DINCAN_INFO();

int size = Marshal.SizeOf(typeof(DINCAN_INFO)) * 3;

byte[] bytes = new byte[size];

IntPtr pBuff = Marshal.AllocHGlobal(size);

DINCAN_INFO[] pDInfo = new DINCAN_INFO[3];

if (ReadDinCanInfo(1811422176, pBuff)) //参数一为卡内码

{

for (int i = 0; i < 3; ++i)

{

IntPtr pPonitor = new IntPtr(pBuff.ToInt64() + Marshal.SizeOf(typeof(DINCAN_INFO)) * i);

pDInfo[i] = (DINCAN_INFO)Marshal.PtrToStructure(pPonitor, typeof(DINCAN_INFO));

MessageBox.Show("订餐日期:" + pDInfo[i].iYear + "-"+ pDInfo[i].iMonth + "-"+ pDInfo[i].iDay);

MessageBox.Show("订餐餐次:" + pDInfo[i].iMeal);

MessageBox.Show("是否取餐:" + pDInfo[i].bTaked);

}

Marshal.FreeHGlobal(pBuff);

MessageBox.Show("读取订餐信息成功");

}

C#调用WriteDinCanInfo关键代码如下:

DINCAN_INFO DinInfo = new DINCAN_INFO();

DinInfo.iYear =Convert.ToUInt32( DateTime.Now.Year);

DinInfo.iMonth = Convert.ToUInt32( DateTime.Now.Month);

DinInfo.iDay = Convert.ToUInt32( DateTime.Now.Day);

DinInfo.iType = 1;

DinInfo.iMeal = 1;

DinInfo.bTaked = false;

int size = Marshal.SizeOf(typeof(DINCAN_INFO)) * 3;

byte[] bytes = new byte[size];

IntPtr pBuff = Marshal.AllocHGlobal(size);

DINCAN_INFO[] pDInfo = new DINCAN_INFO[3];

long ptr = pBuff.ToInt64();

for (int i = 0; i < 3; ++i )

{

IntPtr RPtr = new IntPtr(ptr);

pDInfo[i] = new DINCAN_INFO();

pDInfo[i].iYear = Convert.ToUInt32(DateTime.Now.Year);

pDInfo[i].iMonth = Convert.ToUInt32(DateTime.Now.Month);

pDInfo[i].iDay = Convert.ToUInt32(DateTime.Now.Day);

pDInfo[i].iType = Convert.ToUInt32(i);

pDInfo[i].iMeal = Convert.ToUInt32(i);

pDInfo[i].bTaked = false;

Marshal.StructureToPtr(pDInfo[i], RPtr, false);

ptr += Marshal.SizeOf(typeof(DINCAN_INFO));

}

if (WriteDinCanInfo(1811422176, pBuff)) // 参数一为卡内码

{

MessageBox.Show("写入订餐信息成功");

}

代码看起来比较麻烦,要参考的抄以上代码了,主要思想就是申请一块内存,在申请的这块内存中构建数组对象,然后将这个内存地址作为pDinCanInfo进行调用。两个函数的区别就是如何将内存按定义的数据结构进行解析的区别。

C#调用C、C++结构体数组的方法总结的更多相关文章

  1. C#调用c++Dll 结构体数组指针的问题

    参考文章http://blog.csdn.net/jadeflute/article/details/5684687 但是这里面第一个方案我没有测试成功,第二个方案我感觉有点复杂. 然后自己写啦一个: ...

  2. C#调用C/C++动态库 封送结构体,结构体数组

    一. 结构体的传递 #define JNAAPI extern "C" __declspec(dllexport) // C方式导出函数 typedef struct { int ...

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

    在项目开发时,要调用C++封装的DLL,普通的类型C#上一般都对应,只要用DllImport传入从DLL中引入函数就可以了.但是当传递的是结构体.结构体数组或者结构体指针的时候,就会发现C#上没有类型 ...

  4. 绝对好文C#调用C++DLL传递结构体数组的终极解决方案

    C#调用C++DLL传递结构体数组的终极解决方案 时间 2013-09-17 18:40:56 CSDN博客相似文章 (0) 原文  http://blog.csdn.net/xxdddail/art ...

  5. C#调用C/C++动态库 封送结构体,结构体数组

    因为实验室图像处理的算法都是在OpenCV下写的,还有就是导航的算法也是用C++写的,然后界面部分要求在C#下写,所以不管是Socket通信,还是调用OpenCV的DLL模块,都设计到了C#和C++数 ...

  6. C语言 结构体数组保存到二进制文件中

    在项目中我定义了一个结构体数组,头文件如下: C/C++ code   ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ...

  7. NumPy-快速处理数据--ndarray对象--多维数组的存取、结构体数组存取、内存对齐、Numpy内存结构

    本文摘自<用Python做科学计算>,版权归原作者所有. 上一篇讲到:NumPy-快速处理数据--ndarray对象--数组的创建和存取 接下来接着介绍多维数组的存取.结构体数组存取.内存 ...

  8. C语言 结构体(嵌套结构体--结构体数组)

    //结构体--嵌套结构体和结构体数组 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> ...

  9. C#引用c++DLL结构体数组注意事项(数据发送与接收时)

    本文转载自:http://blog.csdn.net/lhs198541/article/details/7593045 最近做的项目,需要在C# 中调用C++ 写的DLL,因为C# 默认的编码方式是 ...

随机推荐

  1. careercup-高等难度 18.7

    18.7 给定一组单词,编写一个程序,找出其中的最长单词,且该单词由这组单词中的其他单词组合而成. 解法: 原题 给定字符串,以及一个字典,判断字符串是否能够拆分为字段中的单词.例如,字段为{hell ...

  2. js json与对象的相互转换

    var str = '{ "name": "cxh", "sex": "man" }'; //JSON字符串:var o ...

  3. android中broadcastreceiver的用法-代码中注册

    界面如下:     问题1:点击“解绑广播接收器“后再次点击”解绑广播接收器“后,程序崩溃,log信息如下: 08-04 05:04:35.420: E/AndroidRuntime(5521): F ...

  4. ubuntu thrift 0.9.3编译安装

    Table of Contents 1. 下载thrift源代码 2. 编译并安装 3. 运行测试程序 4. 安装 1 下载thrift源代码 git clone https://git-wip-us ...

  5. initrd映像文档的作用和制作

    1.http://pan.baidu.com/s/1dDrGeKL 2.http://wenku.baidu.com/link?url=qPa_jfkEZCbERnwMYWLwm9EZJ_ebMRJA ...

  6. maven添加jetty插件

    pom.xml中增加jetty的配置 <properties> <jetty-version>8.1.13.v20130916</jetty-version> &l ...

  7. 利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化

    1. 首先, JavascriptSerializer类所在名空间: using System.Web.Script.Serialization; 2. 相关的3篇文章, 标记下: 使用JavaScr ...

  8. iOS - UI - UIScrollView

    1.UIScrollView 滚动视图 // 滚动视图 UIScrollView* scrollView = [[UIScrollView alloc]initWithFrame:self.view. ...

  9. 使用MRUnit,Mockito和PowerMock进行Hadoop MapReduce作业的单元测试

    0.preliminary 环境搭建 Setup development environment Download the latest version of MRUnit jar from Apac ...

  10. Jira安装部署

    一.先安装JDK JDK1.6下载:http://www.java.net/download/jdk6/6u10/promoted/b32/binaries/jdk-6u10-rc2-bin-b32- ...