private void RefreshDeceile_Click(object sender, EventArgs e)
{
if (!bInitIPAdminTool)
{
try
{
int hr = lingshi_IPAdminTool.InitSocket2(1);
if (hr <= 0)
{
return;
}
lingshi_IPAdminTool.Func callback = new lingshi_IPAdminTool.Func(AddClientCallback);
lingshi_IPAdminTool.SetCallback(callback);//回调函数可以正确执行一次,
bInitIPAdminTool = true;
}
catch(Exception er)
{
}
}
lingshi_IPAdminTool.Refresh();
}private void AddClientCallback(lingshi_IPAdminTool.Clientinfo _info)
{
//回调函数可以正确执行一次,然后程序自动退出}
{
if (!bInitIPAdminTool)
{
try
{
int hr = lingshi_IPAdminTool.InitSocket2(1);
if (hr <= 0)
{
return;
}
lingshi_IPAdminTool.Func callback = new lingshi_IPAdminTool.Func(AddClientCallback);
lingshi_IPAdminTool.SetCallback(callback);//回调函数可以正确执行一次,
bInitIPAdminTool = true;
}
catch(Exception er)
{
}
}
lingshi_IPAdminTool.Refresh();
}private void AddClientCallback(lingshi_IPAdminTool.Clientinfo _info)
{
//回调函数可以正确执行一次,然后程序自动退出}
{ //断点
} private void AddClientCallback(lingshi_IPAdminTool.Clientinfo _info)
{
try
{
}
catch(Exception er)
{ //断点
}
}
{}执行完,程序就自动退出
当C++第一次调用完你的回调函数后,C#这个时候已经把C++中定义的变量也就是你的那个结构体已经释放了,
所以C++第二次调用的时候,发现结构体变量已经没有了,当然会报错。
处理方法如下:
//定义委托的时候,不要使用结构体,也就是说,定义回调函数的时候不要使用结构体。
//public delegate int ALARM_INFO(ALARMINFO AlarmInfo);
//定义委托的时候,使用指针。
public delegate int ALARM_INFO(IntPtr Fi_AlarmInfo);
//回调函数处理 private int OnRecvAlarm(IntPtr Value)
{
//定义结构体大小的byte数组存放返回数据
byte[] bdata = new byte[2616];
Marshal.Copy(Value, bdata, 0, 2616);
//这里定义你的结构,用来分析返回数据用。
ALARMINFO AlarmInfo = new ALARMINFO();
//注意C++的dll一般都是ascii编码的,C#是Unicode编码,有可能不能正常显示,要注意转换
AlarmInfo.devip = Encoding.Default.GetString(bdata, 0, 20);
//这是整数的转换
AlarmInfo.channel = BitConverter.ToInt32(bdata, 20);
AlarmInfo.ipnum = BitConverter.ToInt32(bdata, 24);
//无数据类型的转换,一般是C++中word类型或long类型
AlarmInfo.alarm_tm.wYear = BitConverter.ToUInt16(bdata, 2048);
}
一般这种问题,可能是动态库出了问题,可能是你传入的参数啊什么的或者对象出了问题,都有可能,让DLL的制作者调试就完事了,你给他你的调用
http://social.msdn.microsoft.com/Forums/zh-CN/visualcshartzhchs/thread/6bcf46db-2c2a-4201-9d90-5476be1c0a4f
,解决了我的问题。