c#调用c++动态链接库

F_bjtu_wxy 2014-04-23 09:20:15
本人之前只接触过少量C#与C++界面编程与通信编写,最近要将vc++程序移植到c#开发,但是动态链接库的调用直接难倒小白,现请各位大神不吝赐教。
此处为vc++中调用动态链接库函数
CH365mReadIoByte(1,&mBaseAddr->mCh365IoPort[p],&Indata1[p]);
此处vC++中头文件定义CH365mReadIoByte
typedef struct _CH365_IO_REG { // CH365芯片的I/O空间
UCHAR mCh365IoPort[0xf0]; // 00H-EFH,共240字节为标准的I/O端口
union { // 以字或者以字节为单位进行存取
USHORT mCh365MemAddr; // F0H 存储器接口: A15-A0地址设定寄存器
struct { // 以字节为单位进行存取
UCHAR mCh365MemAddrL; // F0H 存储器接口: A7-A0地址设定寄存器
UCHAR mCh365MemAddrH; // F1H 存储器接口: A15-A8地址设定寄存器
};
};
UCHAR mCh365IoResv2; // F2H
UCHAR mCh365MemData; // F3H 存储器接口: 存储器数据存取寄存器
UCHAR mCh365I2cData; // F4H I2C串行接口: I2C数据存取寄存器
UCHAR mCh365I2cCtrl; // F5H I2C串行接口: I2C控制和状态寄存器
UCHAR mCh365I2cAddr; // F6H I2C串行接口: I2C地址设定寄存器
UCHAR mCh365I2cDev; // F7H I2C串行接口: I2C设备地址和命令寄存器
UCHAR mCh365IoCtrl; // F8H 芯片控制寄存器,高5位只读
UCHAR mCh365IoBuf; // F9H 本地数据输入缓存寄存器
UCHAR mCh365Speed; // FAH 芯片速度控制寄存器
UCHAR mCh365IoResv3; // FBH
UCHAR mCh365IoTime; // FCH 硬件循环计数寄存器
UCHAR mCh365IoResv4[3]; // FDH
} mCH365_IO_REG, *mPCH365_IO_REG;
现在尝试读取io口的信息,在网上查了一些知识,只因学术不精,只是太杂看不太懂,求各位大神不吝赐教,小弟先行拜谢
...全文
204 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
mjp1234airen4385 2014-04-24
  • 打赏
  • 举报
回复
在C#中调用,要定义一个和VC中一样的结构体,把这个结构体传入到dll中函数,才能完成参数的封送。 例如:vc中调用mBaseAddr就是_CH365_IO_REG这个结构体的变量。 CH365mReadIoByte(1,&mBaseAddr->mCh365IoPort[p],&Indata1[p]); 此处vC++中头文件定义CH365mReadIoByte typedef struct _CH365_IO_REG 在C#中要定义_CH365_IO_REG这个结构体,然后在定义这个结构体的变量A,把这个A调用CH365mReadIoByte时传入
F_bjtu_wxy 2014-04-24
  • 打赏
  • 举报
回复
引用 2 楼 mjp1234airen4385 的回复:
估计是结构体定义不对吧。
谢谢你的回答,你感觉是哪里的结构体定义的不对呢,上面的动态链接库在vc++中已经可以调用了啊
F_bjtu_wxy 2014-04-24
  • 打赏
  • 举报
回复
谢谢你的回答,你感觉是哪里的结构体定义的不对呢,上面的动态链接库在vc++中已经可以调用了啊
F_bjtu_wxy 2014-04-24
  • 打赏
  • 举报
回复
蛋蛋的,晚上调试了一下,实现了,我真是天才,这个论坛太好了,都是大神,结贴结贴啦
mjp1234airen4385 2014-04-24
  • 打赏
  • 举报
回复
估计是结构体定义不对吧。
F_bjtu_wxy 2014-04-24
  • 打赏
  • 举报
回复
看到百度上说的方法如下: ULONG 对应 UInt32 PVOID 对应 UInt32 PUCHAR 对应 char[] 我按照这个方法读取数据结果都是空。。。
F_bjtu_wxy 2014-04-24
  • 打赏
  • 举报
回复
引用 5 楼 mjp1234airen4385 的回复:
在C#中调用,要定义一个和VC中一样的结构体,把这个结构体传入到dll中函数,才能完成参数的封送。 例如:vc中调用mBaseAddr就是_CH365_IO_REG这个结构体的变量。 CH365mReadIoByte(1,&mBaseAddr->mCh365IoPort[p],&Indata1[p]); 此处vC++中头文件定义CH365mReadIoByte typedef struct _CH365_IO_REG 在C#中要定义_CH365_IO_REG这个结构体,然后在定义这个结构体的变量A,把这个A调用CH365mReadIoByte时传入
非常感激你,就你理我了,我按照你的方法结合另个帖子实现了第一个字节数据的读取 我将UCHAR mCh365IoPort[0xf0] 转成c#定义如下 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0xf0)] public string mCh365IoPort; 只能实现第一个字节的读取

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧