异常求助.尝试读取或写入受保护的内存。这通常指示其他内存已损坏

yy2101 2009-11-12 12:05:38
关于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
...全文
312 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
yy2101 2009-11-13
  • 打赏
  • 举报
回复
我觉得问题出在两个输出参数 帮我看看代码哪有问题呗 因为调用别的函数就能成功.,
wuyq11 2009-11-13
  • 打赏
  • 举报
回复
mumu1980 2009-11-13
  • 打赏
  • 举报
回复
去看看msdn里面的数据类型对照表,看看DLL里面的数据应该相应转化为C#中的什么类型
yy2101 2009-11-13
  • 打赏
  • 举报
回复
能说的具体一点吗
soaringbird 2009-11-13
  • 打赏
  • 举报
回复
哪地方的数据类型没有写对
yy2101 2009-11-13
  • 打赏
  • 举报
回复
dll应该没问题吧.看不到源代码啊 ,要不还好说点..
wenbin 2009-11-12
  • 打赏
  • 举报
回复
你的C++库,在连接不正常的时候,会出现异常吗?

实在找不到问题,就看下C++部分是否有?
jingshuaizhjason 2009-11-12
  • 打赏
  • 举报
回复
up

110,567

社区成员

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

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

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