У меня есть следующий код в Native C dll.
typedef void CallbackType( INT32 param1, INT32 param2 );
NATIVE_API void RegisterEventCallBack(CallbackType *callBackFunction);
//INT32 is defined as below:
typedef signed int INT32, *PINT32;
Я должен вызвать этот метод из моего кода C#. Выполнив некоторые решения, доступные в stackflow, я попробовал это:
Декларация делегата:
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void CallbackType(Int32 param1, Int32 param2);
Объявление импорта метода:
[DllImport("EtIPAdapter.dll")]
public static extern void RegisterEventCallBack([MarshalAs(UnmanagedType.FunctionPtr)]CallbackType callbackFunc);
Звонок:
RegisterEventCallBack(ReceivedData);
private static void ReceivedData(Int32 param1, Int32 param2)
{
//Do something
}
Но это не работает, и я получаю следующую ошибку:
Вызов функции PInvoke «RegisterEventCallBack» разбалансировал стек. Вероятно, это связано с тем, что управляемая подпись PInvoke не соответствует неуправляемой целевой подписи. Убедитесь, что соглашение о вызовах и параметры подписи PInvoke соответствуют целевой неуправляемой подписи.
Я также попытался передать указатель функции, который я получил, используя GetFunctionPointerFromDelegate(ReceivedDataDelegate)
. Но это также приводит к той же ошибке.
Ошибка указывает на несоответствие подписи, но я не вижу явного несоответствия подписи. Пожалуйста помоги.
NATIVE_API
? Я думаю, что проблема связана с вашим управляемым объявлением функцииRegisterEventCallBack
, а не с делегатом обратного вызова. Используете ли вы правильное соглашение о вызовах? Кажется странным, чтоRegisterEventCallBack
будет использоватьstdcall
(по умолчанию дляDllImport
), когда его параметр обратного вызова используетcdecl
. - person anton.burger   schedule 09.04.2013