在C++的DLL中有一个函数,原形为
VSCLIB_LoginServer  (OUT int *plHandle,IN ServerAccessInfo *pServerInfo,  IN int Timeout =5000);
其中ServerAccessInfo 为结构体,原形为
ServerAccessInfo 
{
    int m_serverType;      //服务器类型0: 4-channel-server, 1: 1-channel server
    char m_ServerName[32]; //服务器名
    char m_UserName[32];   //用户名 
    char m_Password[32];   //用户密码     
    char m_Url[32];        //IP地址    
    DWORD m_Port;          //端口号
    int m_LinkType;        //连接类型,TCP为1,UDP为2
}
现在我C#中需要调用这个函数,我的代码如下:
        [StructLayout(LayoutKind.Sequential)]
        public struct ServerAccessInfo
        {
            public int m_serverType;      //服务器类型0: 4-channel-server, 1: 1-channel server
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
            public char[] m_ServerName; //服务器名
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
            public char[] m_UserName;   //用户名 
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
            public char[] m_Password;   //用户密码 
            [MarshalAs(UnmanagedType.ByValArray,SizeConst=32)]
            public char[] m_Url;        //IP地址 
            public uint m_Port;          //端口号
            public int m_LinkType;        //连接类型,TCP为1,UDP为2
       }
        [DllImport("VSClientSdk.dll", EntryPoint = "VSCLIB_LoginServer")]
        public static extern int VSCLIB_LoginServer(IntPtr  plHandle, IntPtr pServerInfo, int Timeout);  
在程序中使用:
            ServerAccessInfo m_ServerAccessInfo = new ServerAccessInfo();
            m_ServerAccessInfo.m_serverType = 1;
            m_ServerAccessInfo.m_Port = 3000;
            m_ServerAccessInfo.m_LinkType = 1;
            m_ServerAccessInfo.m_UserName = new char[32];
            m_ServerAccessInfo.m_UserName[0] = '1';
            m_ServerAccessInfo.m_Password = new char[32];
            for (int i = 0; i < 6; i++)
            {
                m_ServerAccessInfo.m_Password[i] = '1';
            }
            string url = "192.168.0.133";
            ////int i=0;
            m_ServerAccessInfo.m_Url = new char[32];
            for (int i = 0; i < url.Length; i++)
            {
                m_ServerAccessInfo.m_Url[i] =Convert.ToChar(url.Substring(i, 1));
                //MessageBox.Show(m_ServerAccessInfo.m_Url[i].ToString());
            }
            m_ServerAccessInfo.m_ServerName = new char[32];
            string servername= "dev1";
            for (int i = 0; i < servername.Length; i++)
            {
                m_ServerAccessInfo.m_ServerName[i] = Convert.ToChar(servername.Substring(i, 1));
            }            IntPtr it = IntPtr.Zero;
            int size = Marshal.SizeOf(typeof(ServerAccessInfo));
            IntPtr ptr_Struct = Marshal.AllocHGlobal(size);
            VSCLIB_LoginServer(it, ptr_Struct, 5000);
            Marshal.PtrToStructure(ptr_Struct, m_ServerAccessInfo);
程序调试结果红色地方出错,信息为此结构不得为值类。参数名: structure
还请有耐心的朋友帮忙看看是哪个地方出了问题。谢谢