如何导入返回此结构的DLL函数? 我有一个DLL及其头文件,用Visual C++编写。我需要在C#项目中使用以下函数:
我可以使用如何导入返回此结构的DLL函数? 我有一个DLL及其头文件,用Visual C++编写。我需要在C#项目中使用以下函数:,c#,visual-c++,dllimport,C#,Visual C++,Dllimport,我可以使用DllImport导入它,但我不知道如何在C#中实现以下结构: 所有大写变量都是我可以在C#项目中使用的已知常量 我知道我必须使用[StructLayout(LayoutKind.Sequential)],但不确定每个结构的成员的等效类型是什么,以及导入时的函数签名是什么。我的C++时代已经有一段时间了。 < P>这应该为你做工作: struct CprDeviceInfo { [MarshalAs(UnmanagedType.ByValTStr, SizeConst = ID
DllImport
导入它,但我不知道如何在C#中实现以下结构:
所有大写变量都是我可以在C#项目中使用的已知常量
我知道我必须使用
[StructLayout(LayoutKind.Sequential)]
,但不确定每个结构的成员的等效类型是什么,以及导入时的函数签名是什么。我的C++时代已经有一段时间了。 < P>这应该为你做工作:
struct CprDeviceInfo
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = ID_LEN)]
string id;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAC_LEN)]
string macAddr;
uint inAddr;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = IP_LEN)]
string ipAddr;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = INFO_NAME_LEN)]
string devName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = INFO_NAME_LEN)]
string port1Name;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = INFO_NAME_LEN)]
string port2Name;
int tcpPort1;
int tcpPort2;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = IP_LEN)]
string interfaceIpAddr;
}
确保在DLLImport中使用默认的
Charset.ASCII
。我建议将结构保留在VC++端,并添加一些调用,以便从c#中逐个读取字符数组。使用互操作传输长度未知的字符或字符串可能很困难。不存在未知的字符串长度-所有长度都定义为常量。我更新了我的问题。太棒了!最后一个问题是我函数的签名是什么。是[DllImport(“CprIf.dll”)]公共静态外部CprFindDevices(参考CprDeviceInfo[]设备,参考int计数,长超时)代码>正确,还是我需要以不同方式处理指针?您使用的long
不正确。这是一个64位整数。DWORD总是32位的。你应该用uint
来代替。啊,好主意。我假设一个字是32位,组成一个DWORD
64。字是16位。所有这些类型都可以追溯到16位的windows 1.0。
typedef struct _CprDeviceInfo
{
unsigned char id[ID_LEN];
unsigned char macAddr[MAC_LEN];
in_addr inAddr;
char ipAddr[IP_LEN];
char devName[INFO_NAME_LEN];
char port1Name[INFO_NAME_LEN];
char port2Name[INFO_NAME_LEN];
int tcpPort1;
int tcpPort2;
char interfaceIpAddr[IP_LEN];
} CprDeviceInfo, *PCprDeviceInfo;
struct CprDeviceInfo
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = ID_LEN)]
string id;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAC_LEN)]
string macAddr;
uint inAddr;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = IP_LEN)]
string ipAddr;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = INFO_NAME_LEN)]
string devName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = INFO_NAME_LEN)]
string port1Name;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = INFO_NAME_LEN)]
string port2Name;
int tcpPort1;
int tcpPort2;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = IP_LEN)]
string interfaceIpAddr;
}