如何导入返回此结构的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;
}