c++与C#结构体转换

山叶溪 2012-05-24 11:39:30
C++的原结构体为
typedef struct
{
char IP[32]; //服务器地址
short port; //端口号
char group[64];
char user[64]; //登录用户名
char passwd[64]; //登录密码
} GE_SERVERPARAMETER
我转化成c#为:
struct GE_PSERVERPARAMETER
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
public char[] IP;
public Int16 port;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
public char[] group;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
public char[] user;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
public char[] passwd; //登录密码
}
在主程序中调用赋值:
GE_PSERVERPARAMETER geps;
string s = "192.168.0.11";

geps.IP = s.ToCharArray();
geps.group = "test";
geps.passwd = "test";
geps.port = 9900;
geps.user = "test";
bool connected = UseDll.GE_ConnectServer(m, geps);//m是我程序中的一个整型变量应该没问题
MessageBox.Show(connected.ToString())
运行后出现错误:
未能封送类型,因为嵌入数组实例的长度与布局中声明的长度不匹配。
于是我又改为:
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string IP;
public Int16 port;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
public string group;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
public string user;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
public string passwd; //登录密码

在主程序中调用赋值:
GE_PSERVERPARAMETER geps;
geps.IP = "122.193.4.19";
geps.group = "test";
geps.passwd = "gest";
geps.port = 9900;
geps.user = "test";
bool connected = UseDll.GE_ConnectServer(m, geps);//m是我程序中的一个整型变量应该没问题
MessageBox.Show(connected.ToString());
运行后出现错误“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”
搞不明白我这两种写法错在哪,应该怎么写,望高手指教
...全文
192 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnfixit 2012-05-24
  • 打赏
  • 举报
回复
这是Mircrosoft P/Invoke Interop Assistant生成的

[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential, CharSet=System.Runtime.InteropServices.CharSet.Ansi)]
public struct Anonymous_4ad7ceb4_c3e2_49fa_8fcf_dc5708e66414 {

/// char[32]
[System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst=32)]
public string IP;

/// short
public short port;

/// char[64]
[System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst=64)]
public string group;

/// char[64]
[System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst=64)]
public string user;

/// char[64]
[System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst=64)]
public string passwd;
}

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧