C++ 转换为c++;结构到c#结构。错误输出
我的C++ <代码> dll >代码>有两个结构: C++: C#: 我将此方法称为: 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++之间的结构大小是相同的,我用以下的答案来解决这个问
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());
}