Mission: From C#, P/Invoke C++ with callbacks to C#
//-----------------------------------------------------------------------
// inside unmanaged C# code
//-----------------------------------------------------------------------
//-----------------------------------------------------------------------
//delegates - define a signatures for unmanaged c++ code to call
//-----------------------------------------------------------------------
public delegate void MessageReceivedDelegate(
int param1,
string messageString,
int param3,
int param4,
int param5);
public delegate void ExceptionParsedDelegate(
string exceptionMessage);
//-----------------------------------------------------------------------
// P/invoke mapping with pointers to delegated methods
//-----------------------------------------------------------------------
[DllImport("my.dll"
, CallingConvention = CallingConvention.StdCall)]
public static extern void an_unmanaged_function(
string aa,
int bb,
string cc,
string dd,
int ee,
int ff,
MessageReceivedDelegate call,
ExceptionParsedDelegate exception);
//-----------------------------------------------------------------------
// perform P/invoke
//-----------------------------------------------------------------------
an_unmanaged_function(
aa
,bb
,cc
,dd
,ee
,ff
,new MessageReceivedDelegate(OnMessageReceived)
,new ExceptionParsedDelegate(OnExceptionReceived));
//-----------------------------------------------------------------------
// delegated methods (called inside unmanaged c++ code)
//-----------------------------------------------------------------------
public void OnExceptionReceived(
string exceptionMessage)
{
//handle exceptionMessage
}
protected void OnMessageParsed(myMessage theMesssage)
{
//handle theMesssage
}
//-----------------------------------------------------------------------
// inside unmanaged c++ code ("my.dll")
//-----------------------------------------------------------------------
//define c++ delegate signatures
typedef void (__stdcall *callbackDelegatePointer)(
int param1,
char message[2100],
int param3,
int param4,
int param5);
typedef void (__stdcall *exceptionDelegatePointer)(
char* exceptionMessage);
//allow p/invoke by delcaring method “extern "C"”
extern "C" __declspec(dllexport)
void __stdcall an_unmanaged_function(
char *aa,
int bb,
char *cc,
char *dd,
int ee,
int ff,
callbackDelegatePointer onMessageReceived,
exceptionDelegatePointer onException)
//call delegates
onMessageReceived(param1, message, param3, param4, param5);
onException("Hello Exception");