当前位置:编程学习 > C#/ASP.NET >>

C#调用DLL(C++)及回调函数的问题

在C#调用C++写的DLL,其中DLL的函数包含了一个回调函数的参数,这个回调函数我将它指定给了C#的一个委托函数,代码如下: 
   [System.Runtime.InteropServices.UnmanagedFunctionPointerAttribute(System.Runtime.InteropServices.CallingConvention.StdCall)] 
delegate void CallBackNetProcess(IntPtr pbyData, Int32 iLen); 
[DllImport("NetCap.dll", EntryPoint = "NetCap_Open", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] 
private static extern int NetCap_Open(CallBackNetProcess callBackProc); //声明全局静态使其能够不被垃圾回收! 
  
private CallBackNetProcess globalCallbackProcedure;  
  
         public void CallBackDataCapture(IntPtr pbyData, Int32 iLen) 
         { 
             byte[] bData = new byte[iLen]; 
             Marshal.Copy(pbyData, bData, 0, iLen); 
             Debug.WriteLine(bData); 
         } 
__________________________________________________________________ 
初始化调用的地方: 
                 globalCallbackProcedure = new CallBackNetProcess(CallBackDataCapture); 
                 iret = NetCap_Open(globalCallbackProcedure); 
                 if (iret > 0) 
                 { 
                     MessageBox.Show("Open failure!"); 
                 } 
—————————————————————————————————— 
以上代码编译是通过了的,执行时也能正常进入回调函数中,完成从网络中接收特定类型的数据,问题是 
:即使网络中已经不存在数据包了,程序中回调函数即“CallBackDataCapture”仍然在执行!!一般要持续一段时间后才停止,感觉是数据“pbyData”堆积在缓冲区中没来得及处理似的?? 
问题出在哪里呢?还望大家帮助一下!!! 
非常感激!期盼中……  dll c# c++ 回调函数 --------------------编程问答-------------------- 自己顶,别沉了,咋没人理呢?肯定给分!!! --------------------编程问答-------------------- - - 没弄明白,帮顶了。 --------------------编程问答-------------------- 试试手动把bData释放掉看:
bData = null; --------------------编程问答-------------------- 实际上bData是要放在另一个委托函数中处理的,但是调试时,去掉了对bData的处理也是存在提到的问题,所以觉得搞不定啊! --------------------编程问答--------------------
引用 3 楼 Mackz 的回复:
试试手动把bData释放掉看:
bData = null;

能说下导致这个问题可能的原因吗?谢谢 --------------------编程问答-------------------- 可能的原因就是你的bData用完没有释放,然后一直累积着到最后垃圾回收机制欻欻欻工作占用时间,所以每次用完手动释放掉也许就不会这样。

这只是可能。 --------------------编程问答--------------------
引用 6 楼 Mackz 的回复:
可能的原因就是你的bData用完没有释放,然后一直累积着到最后垃圾回收机制欻欻欻工作占用时间,所以每次用完手动释放掉也许就不会这样。

这只是可能。

非常感谢!我再试试!
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,