[Mono-dev] libsigc++ signal wrapper
Jonathan Pryor
jonpryor at vt.edu
Sun Oct 28 22:05:05 EDT 2007
On Sun, 2007-10-28 at 22:39 -0300, Mauricio Henriquez wrote:
> Currently, I need to write a wrapper to allow a C# program to connect
> to a signal exposed in a class that use the libsigc++ library, and I
> want to ask if you have any idea, suggestion or documentation related to
> this kind of stuff??
Events are classes of type sigc::signal, and new events are added via
sigc::signal::connect(const sigc::slot_type&). So you need to a way to
get a sigc::slot_type.
Conveniently enough, libsigc++ provides sigc::ptr_fun() which takes a
pointer to a function and creates a sigc::slot_type for it.
So something like this (untested) code should suffice:
// C++
struct AlienDetector {
sigc::signal<void> signal_detected;
};
extern "C" void* CreateAlienDetector ()
{
return new AlienDetector ();
}
void (*SignalDetectedHandler) ();
extern "C" void AlienDetector_AddSignalDetected (
AlienDetector* detector,
SignalDetectedHandler handler)
{
detector->signal_detected.connect (sigc::ptr_fun(handler));
}
// C#
using System.Runtime.InteropServices;
delegate void SignalDetectedHandler ();
class Demo {
[DllImport ("...")] static extern IntPtr
CreateAlienDetector ();
[DllImport ("...")] static extern void
AlienDetector_AddSignalDetected (
IntPtr detector, SignalDetectedHandler h);
static void MyHandler ()
{
Console.WriteLine ("Managed Code Invoked!");
}
static void Main ()
{
IntPtr d = CreateAlienDetector ();
AlienDetector_AddSignalDetected (d, MyHandler);
}
}
- Jon
More information about the Mono-devel-list
mailing list