1. 程式人生 > >C#調用C++函數,類型的已垃圾回收委托進行了回調

C#調用C++函數,類型的已垃圾回收委托進行了回調

tar pri sys 編程 tac 丟失 delegate vda 數據

由於項目需要,C#需要調用C++的庫進行編程.

今天在調試的過程中,突然彈出 ....... 類型的已垃圾回收委托進行了回調。這可能會導致應用程序崩潰、損壞和數據丟失。向非托管代碼傳遞委托時,托管應用程序必須讓這些委托保持活動狀態,直到確信不會再次調用它們。 這是調用的函數. public delegate void VOICEDATACALLBACKV30(int lVoiceComHandle,IntPtr pRecvDataBuffer, uint dwBufSize, byte byAudioFlag, System.IntPtr pUser); public static extern int NET_DVR_StartVoiceCom_V30(int lUserID, uint dwVoiceChan, bool bNeedCBNoEncData, VOICEDATACALLBACKV30 fVoiceDataCallBack, IntPtr pUser); 原來調用的代碼是這樣的: public void Speaker() { CHCNetSDK.NET_DVR_StartVoiceCom_V30(_UserID, 1, true, FVoiceDataCallBack, IntPtr.Zero); } private void FVoiceDataCallBack(int lVoiceComHandle, IntPtr pRecvDataBuffer, uint dwBufSize, byte byAudioFlag, IntPtr pUser) { } 由於委托是Speaker函數裏,一旦調用之後,FVoiceDataCallBack委托在一定時間之後,將會被垃圾回收,所以,會出現以上錯誤. 修改的方法如下: private CHCNetSDK.VOICEDATACALLBACKV30 _Voicedatacallbackv30; public void Speaker() { _Voicedatacallbackv30 = FVoiceDataCallBack; CHCNetSDK.NET_DVR_StartVoiceCom_V30(_UserID, 1, true, _Voicedatacallbackv30, IntPtr.Zero); } private void FVoiceDataCallBack(int lVoiceComHandle, IntPtr pRecvDataBuffer, uint dwBufSize, byte byAudioFlag, IntPtr pUser) { } 這樣做,就將委托放在全局上,不會因為Speaker函數被回收,而導致委托也被回收.

C#調用C++函數,類型的已垃圾回收委托進行了回調