pjercic
pjercic

Reputation: 461

Hooking to a C++ DLL event form C#

I want to hook a C# method to a C++ event written in the C++ DLL

C++ side #include

extern "C"
{
    typedef void (__stdcall *PFN_MYCALLBACK)();
    int __stdcall MyUnmanagedApi(PFN_MYCALLBACK callback);
}

C# side

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

static void Main(string[] args) {

    MyUnmanagedApi(
    delegate()
    {
        Console.WriteLine("Called back by unmanaged side");
    }
    );
    }
}

I followed the http://blogs.msdn.com/b/davidnotario/archive/2006/01/13/512436.aspx

Error

Unhandled Exception: System.EntryPointNotFoundException: Unable to find an entry point named 'MyUnmanagedApi' in DLL 'data_acquisition_sys.dll'. at affect_detection_sys.Program.MyUnmanagedApi(MyCallback callback) at affect_detection_sys.Program.Main(String[] args) in C:\Users\Public\Docume

Upvotes: 0

Views: 2741

Answers (2)

pjercic
pjercic

Reputation: 461

For all interested parties, here is a working solution to the problem.

C++ side

extern "C"
{
typedef void (*callback_function)();
callback_function gCBF;

__declspec(dllexport) void StartAcquisition(callback_function callback) {

    gCBF = callback;

    cout << "Acquisition started" << endl;
}

void DoWork() {
    gCBF()
}
}

C# side

[DllImport("data_acquisition_sys.dll", EntryPoint = "StartAcquisition")]
    public static extern void StartAcquisition(MyCallback callback);
StartAcquisition(delegate()
{

    Console.WriteLine("Called back by unmanaged side ");
}
);

Note that the callback_function is an empty method (), since returning and accepting back ANY data results in a runtime crash. This has been reported in other threads, but the answer hasn't been given.

Upvotes: 2

Roger Rowland
Roger Rowland

Reputation: 26259

MyUnmanagedApi returns int and you have declared void. Try this:

public delegate void MyCallback();
[DllImport("data_acquisition_sys.dll")]
public static extern int MyUnmanagedApi(MyCallback callback);

static void Main(string[] args) {

    MyUnmanagedApi(
    delegate()
    {
        Console.WriteLine("Called back by unmanaged side");
    }
    );
    }
}

Upvotes: 1

Related Questions