I need some help regarding callback function written in c# and called from unmanaged c code. (c dll).
The problem is that the callback function crashs after the first call with a memory access exception. I tried to protect the callback function to be handle by the GC but it doesn't work. What could I do to fix that problem??
Thanks, Michibeck
C Code:
Expand|Select|Wrap|Line Numbers
- /***********************************************************************
- **
- ** Function : APH_RegTxTsHookCb
- **
- ** Description : Registers a callback function that hooks the
- ** Tx timestamps to the application.
- ** Only one callback function can be registered.
- **
- ** See Also : APH_UnregTxTsHook()
- **
- ** Parameter : pf_cbTxTs (IN) - Tx timestamp callback function to register
- **
- ** Returnvalue : -
- **
- ** Remarks : -
- **
- ***********************************************************************/
- void APH_RegTxTsHookCb( void (k_CB_CALL_CONV *pf_cbTxTs)(PTP_t_TmStmp s_txTs,
- UINT16 w_seqId,
- UINT16 w_txIfIdx,
- PTP_t_msgTypeEnum e_mType));
- /***********************************************************************
- **
- ** Function : APH_UnregTxTsHook
- **
- ** Description : Unregisters the Tx timestamp hook function.
- **
- ** See Also : APH_RegTxTsHookCb()
- **
- ***********************************************************************/
- void APH_UnregTxTsHook( void );
C# Code:
Expand|Select|Wrap|Line Numbers
- public delegate void TxTsHookCb([MarshalAs(UnmanagedType.Struct)] sTimeStamp s_rxTs, UInt16 w_seqId, UInt16 w_rxIfIdx, ePTPMsgTypes e_mType);
- public class PTP
- {
- [DllImport("MyDll.dll")]
- static extern void APH_RegTxTsHookCb([MarshalAs(UnmanagedType.FunctionPtr)]TxTsHookCb callback);
- [DllImport("MyDll.dll")]
- static extern void APH_UnregTxTsHook();
- public static void TxHookCbFunc([MarshalAs(UnmanagedType.Struct)]sTimeStamp s_rxTs, UInt16 w_seqId, UInt16 w_rxIfIdx, ePTPMsgTypes e_mType)
- {
- Console.WriteLine(w_seqId);
- Console.WriteLine(s_rxTs.Print());
- Console.WriteLine(w_rxIfIdx);
- Console.WriteLine(e_mType);
- }
- public static sMsgTimeStamp GetTransmittingTimestamp(ePTPMsgTypes msgType, uint timeoutSec)
- {
- TxTsHookCb callbackTx = new TxTsHookCb(TxHookCbFunc);
- int i = 0;
- timeStampBuffer = new sMsgTimeStamp();
- timeStampBuffer.IsSet = false;
- timeStampBuffer.srcPort = ownPortId;
- timeStampBuffer.msgType = msgType;
- APH_RegTxTsHookCb(callbackTx);
- while (!timeStampBuffer.IsSet)
- {
- System.Threading.Thread.Sleep(500);
- i++;
- if (i * 2 > timeoutSec) break;
- }
- APH_UnregTxTsHook();
- GC.KeepAlive(callbackTx);
- return timeStampBuffer;
- }
- }