首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

c++与C#结构体转换,该怎么解决

2012-06-07 
c++与C#结构体转换C++的原结构体为typedef struct{char IP[32]//服务器地址short port//端口号char grou

c++与C#结构体转换
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());
运行后出现错误“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”
搞不明白我这两种写法错在哪,应该怎么写,望高手指教


[解决办法]
这是Mircrosoft P/Invoke Interop Assistant生成的

C# code
[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;} 

热点排行