C++ 转换为c++;结构到c#结构。错误输出

C++ 转换为c++;结构到c#结构。错误输出,c++,dll,struct,export,C++,Dll,Struct,Export,我的C++ dll >代码>有两个结构: C++: C#: 我将此方法称为: C++: C#: 我这样叫: C#: 输出为: GetNetworkInfo返回正常结果,但RegNewUser输出此错误: 错误:无法封送类型,因为嵌入数组实例的长度与布局中声明的长度不匹配 如何解决此问题?在macAddr和gateway成员之间是否存在填充?C和C++之间的布局完全相同吗?您可能希望将字节数组作为最后一个成员移动。成员之间没有填充。C和C++之间的结构大小是相同的,我用以下的答案来解决这个问

我的C++ <代码> dll >代码>有两个结构:

C++:

C#:

我将此方法称为:

C++:

C#:

我这样叫: C#:

输出为:

GetNetworkInfo
返回正常结果,但
RegNewUser
输出此错误:

错误:无法封送类型,因为嵌入数组实例的长度与布局中声明的长度不匹配


如何解决此问题?

macAddr
gateway
成员之间是否存在填充?C和C++之间的布局完全相同吗?您可能希望将字节数组作为最后一个成员移动。成员之间没有填充。C和C++之间的结构大小是相同的,我用以下的答案来解决这个问题。
typedef struct interface_info {
    DWORD   index;
    DWORD   ipv4Addr;
    BYTE    macAddr[6];
    DWORD   gateway;
}I_INFO;

typedef struct user_info {
    DWORD   uniqueid;
    BYTE    userid[32];
    BYTE    pwd[32];
    BYTE    info[5][64];        
}U_INFO;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct I_INFO
{
    public uint Index;
    public uint ipv4Addr;   
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
    public byte[] macAddr;   
    public uint gateway;
}; 

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct U_INFO
{
    public uint uniqueid;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
    public byte[] userid;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
    public byte[] pwd;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 320)]
    public byte[] info;
};
void GetNetworkInfo(I_INFO *n); // Show interface Info
dword RegNewUser(U_INFO *u);    // Save to test.ini
[DllImport("TestNet.dll")]
public static extern void GetNetworkInfo(ref I_INFO n);
[DllImport("TestNet.dll")]
public static extern uint RegNewUser(ref U_INFO u);
I_INFO ii = new I_INFO();
GetNetworkInfo(ref ii);

MessageBox.Show(ii.index+ "\n"
          + Long2ip(ii.ipAddr) + "\n"
          + Long2ip(ii.gateway) + "\n"
          + Bytes2Str(ii.macAddr);
....

I_INFOuser = new I_INFO
{
    uid = Encoding.ASCII.GetBytes("testUser"),
    pwd = Encoding.ASCII.GetBytes("testPassword"),
    info = Encoding.ASCII.GetBytes("hello world!")
};
try
{
    RegNewUser(ref user);
}
catch(Exception err)
{
    MessageBox.Show(err.ToString());
}