Адам прав, у вас несоответствие соглашения о вызовах в 32-разрядной версии Windows. По умолчанию указатель функции равен __cdecl, а объявление делегата - CallingConvention.StdCall. Несоответствие приводит к тому, что указатель стека не восстанавливается должным образом при возврате вызова делегата, вызывая диагностику в отладочной сборке кода C / C ++.
Чтобы исправить это на стороне C / C ++:
typedef int (__stdcall * Callback)(int, int);
extern "C" _declspec(dllexport) int testDelegate(Callback addFunction, int a, int b)
{
int res = addFunction(a, b);
return res;
}
Чтобы исправить это на стороне C #:
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate int AddIntegersDelegate(int number1, int number2);