高分求救:C#调用C++的dll,dll的回调函数报错

luzhuobin 2017-10-12 09:30:12
C#调用C++的dll,C++里面有个回调函数,回调的时候报错了
...全文
212 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
xian_wwq 2018-12-04
  • 打赏
  • 举报
回复
碰到C++指针参数,需要将地址转为不被垃圾收集器清理的固定地址。 有个示例可以参考:

bool  FireSDK_GetDeviceList(int loginid, DEVICE ** devinfo, int * devcount, CHANNEL ** chinfo, int * chcount);


struct devinfo
{
public string devID;  
public string devName;
   
//……
}
//调用
devinfo di = new devinfo();
di.devID = "KD0000299";
di.devName="myDevice";

GCHandle C_di = GCHandle.Alloc(di, GCHandleType.Pinned);
FireSDK_GetDeviceList(loginid,out C_di.AddrOfPinnedObject(),...); 
C_di.Free();

luzhuobin 2017-10-19
  • 打赏
  • 举报
回复
加static没有用,我另开线程跑下面这一段,程序就再也没有报错了!有人能讲解一下原因吗? while (true) { System.Threading.Thread.Sleep(3600000); GC.KeepAlive(CbOnFrontDelegate); }
luzhuobin 2017-10-13
  • 打赏
  • 举报
回复
之前曾经把这几个变量和函数都打上static,但还是报同样的错误!
ilikeff8 2017-10-13
  • 打赏
  • 举报
回复
写成全局static,保持引用,防止太久未有任何引用而被垃圾回收
luzhuobin 2017-10-13
  • 打赏
  • 举报
回复
以下是代码的一些片段,请问要怎样改正: [UnmanagedFunctionPointer(CallingConvention.StdCall)] public delegate void CbOnFrontEvent(IntPtr pObject, EnumOnFrontType type, int nReason); private Interop.CbOnFrontEvent CbOnFrontDelegate; protected void CbOnFrontFunc(IntPtr pObject, EnumOnFrontType type, int nReason) { if (OnFrontEvent != null) OnFrontEvent(null, new OnFrontEventArgs(type, nReason)); } public FtdcMdAdapter(string pszFlowPath, bool bIsUsingUdp, bool bIsMulticast) { Handle = Interop.MdCreateApi(pszFlowPath, bIsUsingUdp, bIsMulticast); CbOnFrontDelegate = CbOnFrontFunc; Interop.MdRegisterCallback(Handle, CbOnFrontDelegate); }
wanghui0380 2017-10-13
  • 打赏
  • 举报
回复
把回调函数写出static即可
luzhuobin 2017-10-12
  • 打赏
  • 举报
回复
因为回调函数用的是全局变量,GC应该是不会回收的吧?但是GC有可能会做碎片整理,把回调函数的地址给改了,dll还是调用原来的地址,结果就报错了,是不是这样呢?
luzhuobin 2017-10-12
  • 打赏
  • 举报
回复
程序一直开着,回调函数也执行了很多次都没有异常,几天后就会有这样的报错。
luzhuobin 2017-10-12
  • 打赏
  • 举报
回复
百度了一遍,都说是使用这个UnmanagedFunctionPointer,并且使用全局变量。但是这些都用上了,还是报错

110,533

社区成员

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

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

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