c# 调用回调函数出错
各位大神:
小弟在用 c# 托管调用 vc++ dll 中的回调函数。执行完回调函数后,程序就报错:
TestIm.exe 中的 0x00000000 处有未经处理的异常: 0xC0000005: Access violation。
翻了翻资料,得知这个异常是因为托管代码中某些用于封送的数据对象被CLR的垃圾收集器回收了,这导致了非托管代码在访问这些对象时出现了非法访问,继而CLR封装异常对象并将其抛出。我看到有的朋友在封送C++中char类型数组/指针或结构体指针是遇到了这个异常,而我则是在封送C++函数指针时遇到的,由此看来,导致这个异常的原因都与封送指针有关。
参考地址:http://blog.csdn.net/xiaxiaonline/article/details/7069546
代码如下,怎么修改为好?
//回调登录
public delegate void CallBackLogin(long groupid, int nStatus, long nServerTime, int nResult);
//回调失败原因
public delegate void CallBackLogOut(ELOGOUTREASON reason);
//回调获取好友
public delegate void CallBackGetFriends(long groupid, string userinfo);
//回调更新基本信息
public delegate void CallBackUpdateBaseInfo(long nUserid, string xml);
//回调用户状态更新
public delegate void CallBackUserStatusUpdate(long nUserid, EUETYPE eUEType, string szStatusDesc);
public CallBackLogin CbLogIn;
public CallBackLogOut CbLogOut;
public CallBackGetFriends CbGetFriends;
public CallBackUserStatusUpdate CbUserStatus;
[DllImport("ImApi.dll")]
public static extern void Login([MarshalAs(UnmanagedType.LPArray)]char[] name, [MarshalAs(UnmanagedType.LPArray)]char[] password, int status,[MarshalAs(UnmanagedType.U4)]EUETYPE mytype, bool bAnonymous);
private void btnlogin_Click(object sender, EventArgs e)
{
//
string path = "";
path = "d:\\bbb";
string name, pwd;
name = "kxt";
pwd = "123456";
//注册登录
CbLogIn = new CallBackLogin(OnLogin);
RegLoginCallBack(login);
//注册离开
CbLogOut = new CallBackLogOut(OnLogOut);
RegLogoutCallBack(CbLogOut);
//获取好友列表
CbGetFriends = new CallBackGetFriends(OnGetFriends);
RegGetFriendsCallBack(CbGetFriends);
//更新调用状态
CbUserStatus = new CallBackUserStatusUpdate(OnUpdateUserStatus);
RegUserStatusUpdatedCallBack(CbUserStatus);
bool bAnonymous = false;
StringBuilder name1 = new StringBuilder(36);
name1.Append("kxt");
StringBuilder pwd1 = new StringBuilder(30);
pwd1.Append("123456");
Login(name.ToCharArray(),pwd.ToCharArray(), 1, EUETYPE.EUETYPE_PC, bAnonymous);
}
public void OnLogin(long userid, int nStatus, long nServerTime, int nResult)
{
if (nResult == 0)
MessageBox.Show("userid:" + userid.ToString() + "nstatus:" + nStatus.ToString() + "nServerTime:" + nServerTime.ToString() + "NResult:" + nResult.ToString());
else
MessageBox.Show("登录失败!");
}
private void OnLogOut(ELOGOUTREASON reason)
{
//
MessageBox.Show("OnLogOut");
//Thread.CurrentThread.Abort();
}
private void OnGetFriends(long nUserid, string userxml)
{
//
MessageBox.Show("userxml");
}
private void OnUpdateUserStatus(long nUserID, EUETYPE nStatus, string szStatusDesc)
{
//
MessageBox.Show("UpdateUserStatus");
}