• 欢迎访问,如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

C++ dll中的指针 怎么样在C#里面定义和声明

.Net技术 码拜 3年前 (2017-04-26) 242次浏览
C++ DLL
定义如下:
/*usb relay board info structure*/
struct usb_relay_device_info
{
unsigned char *serial_number;
char *device_path;
usb_relay_device_type type;
usb_relay_device_info* next;
};
struct usb_relay_device_info EXPORT_API * usb_relay_device_enumerate(void);
int EXPORT_API  usb_relay_device_open(struct usb_relay_device_info* device_info);
讨教在C#中应该怎么去定义那个结构体,以及声明那两个函数?
解决方案

10

C++ dll中的指针 怎么样在C#里面定义和声明
友情帮顶,爱莫能助……

60

你这里usb_relay_device_info* next;指向的是本地堆而不是托管堆上的内存,所以无法用C#类型表示。你可以把结构内部的数据深复制到托管堆,需要的时候写到本地堆之后再调用非托管代码访问。System.Runtime.InteropServices里面有个Marshal类可以帮你做这类复制(Marshal.Copy和Marshal.Write),但是读写需要的位移取决于你的C++代码的编译选项,例如usb_relay_device_type type在结构体中的位移是取决于unsigned char *serial_number;这个指针的大小,而usb_relay_device_info* next;的位移是取决于前两个成员的大小和编译器的字节对齐方式。

10

unsigned char * 指针在C#你可以认为是一个byte[] 数组
char * 指针在C#代码中用string就可以了,本质上是一样的东西。全部结构体中前两个你可以写成
byte[] serial_number;
string device_path;
后面的两个结构体,你需要重新在C#代码中声明一个那样的结构体,然后在用声明的结构体在你刚刚发的结构体中定义。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C++ dll中的指针 怎么样在C#里面定义和声明
喜欢 (0)
[1034331897@qq.com]
分享 (0)