由於項目需要,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函數被回收,而導致委托也被回收.