关于C#调用C++的DLL时出现的问题C++ code:
结构原型:
typedef struct ik_longshine_person_info_s
{
int person_id;
char person_name[128];
char employee_num[128];
int iris_enroll_flag;
int sex;
char blood_type[20];
char birthday[20];
char id_card[64];
char phone[64];
char address[256];
char zip_code[20];
char email_addr[128];
}ik_longshine_person_info_t;typedef struct ik_longshine_person_array_s
{
int person_count;
ik_longshine_person_info_t *persons;
}ik_longshine_person_array_t;,// 输入参数 ik_longshine_person_info_t *pPerson , 输出参数 local_person, server_person中的persons指向的内存需要调用ik_as_free来释放
int STDCALL ik_as_sync_person (IK_LS_ATTEND_SERVER_HANDLE handle, ik_longshine_person_info_t *pPerson, int nPersonCount,ik_longshine_person_array_t *local_person,ik_longshine_person_array_t *server_person);下边是我写的代码,大家帮忙看看错在哪里谢谢了
[DllImport("IKLongShine-2_0_0.dll")]
public extern unsafe static int ik_as_sync_person(IntPtr handle,ik_longshine_person_info_t[] pPerson,int nPersonCount,out ik_longshine_person_array_t local_person,out ik_longshine_person_array_t server_person); [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct ik_longshine_person_info_t
{
//必填项
public int person_id;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string person_name;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string employee_num;
public int iris_enroll_flag;
//选填项
public int sex;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string blood_type;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string birthday;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
public string id_card;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
public string phone;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public string address;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string zip_code;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string email_addr;
} [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct ik_longshine_person_array_t
{
[MarshalAs(UnmanagedType.SafeArray)]
public ik_longshine_person_info_t[] persons;
public int person_count;
}
private void btnTongbu_Click(object sender, EventArgs e)
{
ConnDB.Constr = readINI();
ConnDB.Open();
string ip = "127.0.0.1";
IntPtr handle = ik_as_connect(ip, 9988, 1000);
MessageBox.Show(handle.ToString());
ik_longshine_person_info_t[] persons = new ik_longshine_person_info_t[1750];
ik_longshine_person_array_t local;
ik_longshine_person_array_t server;
DataSet ds = new DataSet();
ds = ConnDB.GetData("select irisID,name,serialNum from tb_emp_info");
DataTable dt = ds.Tables[0];
int count = 0;
for (int i = 0; i < dt.Rows.Count;i++ )
{
persons[i].person_id = Convert.ToInt32(dt.Rows[i]["irisID"]);
persons[i].person_name = dt.Rows[i]["name"].ToString();
persons[i].employee_num = dt.Rows[i]["serialNum"].ToString();
persons[i].iris_enroll_flag = 0;
count = i;
}
int tongbuMsg = ik_as_sync_person(handle, persons, count, out local, out server); //此处报异常
MessageBox.Show(tongbuMsg.ToString());
ik_longshine_person_info_t[] localPerson = local.persons;
int localCount = local.person_count;
ik_longshine_person_info_t[] serverPerson = server.persons;
int serverCount = server.person_count;
int delMsg = ik_as_del_person(handle, serverPerson, serverCount);
MessageBox.Show(delMsg.ToString());
ik_as_close(handle);
}ik_as_connect为连接服务器函数,如果服务器没有连接正常 就会出现这个异常,现在服务器没问题,返回的句柄也正确 怎么还会出现异常呢异常信息:
在 MainFrm.ik_as_sync_person(IntPtr handle, ik_longshine_person_info_t[] pPerson, Int32 nPersonCount, ik_longshine_person_array_t& local_person, ik_longshine_person_array_t& server_person)
在 MainFrm.btnTongbu_Click(Object sender, EventArgs e) 位置 MainFrm.cs:行号 534
结构原型:
typedef struct ik_longshine_person_info_s
{
int person_id;
char person_name[128];
char employee_num[128];
int iris_enroll_flag;
int sex;
char blood_type[20];
char birthday[20];
char id_card[64];
char phone[64];
char address[256];
char zip_code[20];
char email_addr[128];
}ik_longshine_person_info_t;typedef struct ik_longshine_person_array_s
{
int person_count;
ik_longshine_person_info_t *persons;
}ik_longshine_person_array_t;,// 输入参数 ik_longshine_person_info_t *pPerson , 输出参数 local_person, server_person中的persons指向的内存需要调用ik_as_free来释放
int STDCALL ik_as_sync_person (IK_LS_ATTEND_SERVER_HANDLE handle, ik_longshine_person_info_t *pPerson, int nPersonCount,ik_longshine_person_array_t *local_person,ik_longshine_person_array_t *server_person);下边是我写的代码,大家帮忙看看错在哪里谢谢了
[DllImport("IKLongShine-2_0_0.dll")]
public extern unsafe static int ik_as_sync_person(IntPtr handle,ik_longshine_person_info_t[] pPerson,int nPersonCount,out ik_longshine_person_array_t local_person,out ik_longshine_person_array_t server_person); [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct ik_longshine_person_info_t
{
//必填项
public int person_id;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string person_name;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string employee_num;
public int iris_enroll_flag;
//选填项
public int sex;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string blood_type;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string birthday;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
public string id_card;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
public string phone;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public string address;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string zip_code;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string email_addr;
} [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct ik_longshine_person_array_t
{
[MarshalAs(UnmanagedType.SafeArray)]
public ik_longshine_person_info_t[] persons;
public int person_count;
}
private void btnTongbu_Click(object sender, EventArgs e)
{
ConnDB.Constr = readINI();
ConnDB.Open();
string ip = "127.0.0.1";
IntPtr handle = ik_as_connect(ip, 9988, 1000);
MessageBox.Show(handle.ToString());
ik_longshine_person_info_t[] persons = new ik_longshine_person_info_t[1750];
ik_longshine_person_array_t local;
ik_longshine_person_array_t server;
DataSet ds = new DataSet();
ds = ConnDB.GetData("select irisID,name,serialNum from tb_emp_info");
DataTable dt = ds.Tables[0];
int count = 0;
for (int i = 0; i < dt.Rows.Count;i++ )
{
persons[i].person_id = Convert.ToInt32(dt.Rows[i]["irisID"]);
persons[i].person_name = dt.Rows[i]["name"].ToString();
persons[i].employee_num = dt.Rows[i]["serialNum"].ToString();
persons[i].iris_enroll_flag = 0;
count = i;
}
int tongbuMsg = ik_as_sync_person(handle, persons, count, out local, out server); //此处报异常
MessageBox.Show(tongbuMsg.ToString());
ik_longshine_person_info_t[] localPerson = local.persons;
int localCount = local.person_count;
ik_longshine_person_info_t[] serverPerson = server.persons;
int serverCount = server.person_count;
int delMsg = ik_as_del_person(handle, serverPerson, serverCount);
MessageBox.Show(delMsg.ToString());
ik_as_close(handle);
}ik_as_connect为连接服务器函数,如果服务器没有连接正常 就会出现这个异常,现在服务器没问题,返回的句柄也正确 怎么还会出现异常呢异常信息:
在 MainFrm.ik_as_sync_person(IntPtr handle, ik_longshine_person_info_t[] pPerson, Int32 nPersonCount, ik_longshine_person_array_t& local_person, ik_longshine_person_array_t& server_person)
在 MainFrm.btnTongbu_Click(Object sender, EventArgs e) 位置 MainFrm.cs:行号 534
数组问题
null 值都可能导致,传递的参数。检查代码
http://topic.csdn.net/u/20090522/20/ae470ef3-b964-4c45-aa89-4b07ae7b4ef6.html
http://topic.csdn.net/u/20090627/10/82b3a870-ae70-483b-8b9d-ff6c96d81003.html?52383