Маршалинг обратных вызовов из C++ в C#
У меня есть SDK от третьей стороны-поставщика камер (Hasselblad), который предоставил SDK для подключения ПК к своей камере. SDK состоит из библиотеки DLL C++ и неуправляемого примера приложения C++, использующего эту библиотеку DLL. Я могу правильно упорядочить все методы в своем коде C#, кроме обратного вызова. Кроме того, пример приложения работает просто отлично из их неуправляемого исходного кода C++. Заголовок DLL для обратного вызова C++ выглядит следующим образом:
#define PHOCUS_API __declspec( dllexport ) #define PHOCUS_API_CALL __stdcall typedef HRESULT (CALLBACK *STATUS_MESSAGE_CALLBACK )( void* ref, HRESULT hr, LPCWSTR pszMessage ); PHOCUS_API HRESULT PHOCUS_API_CALL SetStatusMessageCallback( HANDLE hClient, STATUS_MESSAGE_CALLBACK pfnCallback, void* ref );
Что я уже пробовал:
У меня есть следующие операторы импорта в верхней части простой основной точки входа, а также определения делегатов и событий.
[DllImport("PhocusApi64.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)] public static extern Int32 SetStatusMessageCallback(IntPtr hClient, STATUS_MESSAGE_CALLBACK PhocusMessageCallback, IntPtr refx); public delegate Int32 STATUS_MESSAGE_CALLBACK(IntPtr refs, Int32 HRESULT, String szMessage); public static event STATUS_MESSAGE_CALLBACK MessageResponse;
I use other DLL methods to create handles to the installed camera devices (PhocusDevices[0]). I can use these handles to do functions such as setting the aperture, getting the serial number etc. Also, I can command the camera to take a picture. The variable "Result" is returned from the DLL methods and indicate that the methods are working properly. In the sample application that I am replicating in the managed code, the CALLBACK fires properly and I can step into the C++ code. My C# code compiles w/o error and I can step through all the C# statements without exceptions. In the C# case, I cannot get the delegate to fire after commanding a image capture -- although I hear the camera trigger and can access the image. I have the following statements in my C# code.
IntPtr Result = SetStatusMessageCallback(PhocusDevices[0], ResponseAfterImageDownload, (IntPtr)0); static Int32 ResponseAfterImageDownload(IntPtr refs, Int32 HRESULT, String MessageResponse += ResponseAfterImageDownload;
static Int32 ResponseAfterImageDownload(IntPtr refs, Int32 HRESULT, String szMessage) { int a = 0; // this method will be entered when we get a message from Phocus return 0; }
Ваши мысли будут оценены по достоинству ...
Джим