gpt4 book ai didi

c# - 编码指向结构数组的指针

转载 作者:行者123 更新时间:2023-11-30 22:04:41 25 4
gpt4 key购买 nike

我正在尝试为为 c/cpp 编写的力传感器调用驱动程序 dll。工作的 Cpp 代码如下所示:

我用dll自带的头文件,struct是这样定义的

typedef struct
{
DWORD usb_hid_idx;
int open;
char vid_pid[256];
char dev_info[256];
char sn_info[256];
int hw_info;
unsigned char hw_var;
int fw_vers;
} t_DeviceInfo;

我需要调用的函数定义如下:

extern "C" DLL_API int Search(t_DeviceInfo *p_dev_info);

在主要代码中,我只是创建了一个由先前定义的t_DeviceInfo结构和一个指向第一个元素的指针组成的数组,并使用该指针调用函数Search:

t_DeviceInfo deviceInfo[16];
t_DeviceInfo* deviceInfoPtr = &deviceInfo[0];
int ret = search(deviceInfoPtr);

至少在那里,一切正常。对于 C#,它目前看起来像这样:

unsafe public struct t_DeviceInfo
{
long usb_hid_idx;
int open;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
char[] vid_pid;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
char[] dev_info;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
char[] sn_info;
int hw_info;
char hw_var;
int fw_vers;
}

unsafe public class ASTAS
{
[DllImport("ASTAS_DLL.dll")]
public extern static int Search(t_DeviceInfo* devInfPtr);
}

主要是:

t_DeviceInfo[] devInfo = new t_DeviceInfo[16];

但仅此而已。如何将结构数组编码到固定的内存位置并将相应的指针传递给 Search()

最佳答案

这里不需要unsafe。您也可以删除它。而且您的结构声明不正确。有些类型是错误的。 C++ DWORD 是一个无符号的 32 位值。 C# long 是带符号的 64 位值。 C++ unsigned char 是一个无符号的 8 位值。 C# 字符是 16 位字符。通常 unsigned char 映射到 byte

结构应该是:

[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
public struct t_DeviceInfo
{
uint usb_hid_idx;
int open;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
string vid_pid;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
string dev_info;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
string sn_info;
int hw_info;
byte hw_var;
int fw_vers;
}

函数声明应该是:

[DllImport("ASTAS_DLL.dll")]
public extern static int Search([In] t_DeviceInfo[] devInfPtr);

这假定调用约定是 stdcall。在我看来它实际上是 cdecl。在这种情况下,您需要:

[DllImport("ASTAS_DLL.dll", CallingConvention=CallingConvention.Cdecl)]
public extern static int Search([In] t_DeviceInfo[] devInf);

我使用了[In] 编码。您可能需要根据语义修改它,我无法从提供的信息中辨别出来。

关于c# - 编码指向结构数组的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25033095/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com