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);

プログラムを実行すると、実際にはラムダ関数に入りますが、関数を終了するとすぐにクラッシュします (「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 に答える