2

我试图包装由 SDL2 定义的这个函数。

它的签名是

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 已停止工作”)。

什么可能导致崩溃?

4

1 回答 1

3
 #define SDLCALL __cdecl

你有一个调用约定不匹配。您的本机代码需要一个 __cdecl 函数,但您的 C# 代码声明了一个委托,该委托将映射到一个 __stdcall 回调。非托管代码互操作的默认值。您必须像这样声明它:

    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
    public delegate int EventFilter(IntPtr userData, IntPtr type);
于 2013-08-05T21:13:50.130 回答