Triggering event in C# from C++ DLL
Asked Answered
C

2

7

I have an umanaged C++ DLL which is communicating with a Cisco Server (UCCX).

It sends and receives messages to and from this server via TCP/IP. Now there are some types of messages it receives which contains some parameters which it needs to send to a C# GUI which will display these parameters on screen.

Please tell me an efficient method to trigger an event in C# from this DLL.

Cuman answered 25/9, 2012 at 5:56 Comment(0)
D
11

http://blogs.msdn.com/b/davidnotario/archive/2006/01/13/512436.aspx seems to answer your question. You use a delegate on the C# side and a standard callback on the C++ side.

C++ side:

typedef void (__stdcall *PFN_MYCALLBACK)();
int __stdcall MyUnmanagedApi(PFN_ MYCALLBACK callback);

C# side

public delegate void MyCallback();
[DllImport("MYDLL.DLL")] public static extern void MyUnmanagedApi(MyCallback callback);

public static void Main()
{
  MyUnmanagedApi(
    delegate()
    {
      Console.WriteLine("Called back by unmanaged side");
    }
   );
}
Dorty answered 25/9, 2012 at 5:59 Comment(1)
Thanks, worked mint and I didnt have to think about it... Note that the C++ function MyUnManagedAPI should have a void return type to match its C# counterpart.Mattland
M
1

Note the C++ side should be

typedef void (__stdcall *PFN_MYCALLBACK)();
extern "C" __declspec(dllexport) void __stdcall MyUnmanagedApi(PFN_ MYCALLBACK callback);

An alternate option is to drop the __stdcall on the C++ side

typedef void (*PFN_MYCALLBACK)();
extern "C" __declspec(dllexport) void MyUnmanagedApi(PFN_ MYCALLBACK callback);

And on the C# side:

public delegate void MyCallback();
[DllImport("MYDLL.DLL", CallingConvention = CallingConvention.Cdecl))] 
public static extern void MyUnmanagedApi(MyCallback callback);

as above ...
Mattland answered 12/1, 2018 at 6:2 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.