我正在尝试包装SDL2定义的this function。
它的签名是
void SDL_AddEventWatch(SDL_EventFilter filter, void* userdata)
SDL_EventFilter
typedef int (SDLCALL * SDL_EventFilter) (void *userdata, SDL_Event * event);
因此,我已经定义了我的包装器:
public delegate int EventFilter(IntPtr userData, IntPtr type);
[DllImport("SDL2.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_AddEventWatch")]
public static extern void AddEventWatch(EventFilter filter, IntPtr userData);
我正在测试它:
SDL.AddEventWatch((data, e) =>
{
return 0;
}, IntPtr.Zero);
当我运行我的程序时,它实际上进入了lambda函数,但是一旦它退出函数就会立即崩溃(“vshost32.exe已经停止工作”)。
可能导致崩溃的原因是什么?
答案 0 :(得分:3)
#define SDLCALL __cdecl
您的呼叫约定不匹配。您的本机代码需要__cdecl函数,但您的C#代码声明了一个将映射到__stdcall回调的委托。非托管代码互操作的默认值。你必须这样声明:
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate int EventFilter(IntPtr userData, IntPtr type);