在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
还请有耐心的朋友帮忙看看是哪个地方出了问题。谢谢
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
还请有耐心的朋友帮忙看看是哪个地方出了问题。谢谢
这个文章对你应该有帮助