1

次のコードを使用して、C# アプリへのネイティブ コールバックを実行しようとしています。

C#:

public delegate void MyCallback(int i );
[DllImport("core.dll")]
public extern static void set(MyCallback cb);
public static void callmemaybe(int i)
{
    Console.Write(i);
}
[DllImport("lgcoree.dll")]
public extern static void Post();
static void Main()
{
    set(callmemaybe);
    Post();
}

C++:

void (*callback)(int) ;
extern "C" __declspec(dllexport) void __cdecl set( void (*cb)(int)  )
{
callback = cb;
}
extern "C" __declspec(dllexport) void __cdecl  Post()
{
callback(1);
}

このコードを実行すると、callmemaybe メソッドが実行された直後に、次のエラーが表示されます。これは通常、ある呼び出し対流で宣言された関数を、別の呼び出し対流で宣言された関数ポインターで呼び出した結果です。

しかし、callmemaybe 関数からパラメーターを削除してコードを調整すると (デリゲートとエクスポートされた関数からパラメーターを削除します)、完全に機能します。

4

1 に答える 1

3

Post() と set() は呼び出し規約として __cdecl を持っているので、おそらくそれを指定する必要があります:

[DllImport("core.dll", CallingConvention=CallingConvention.Cdecl)]
public extern static void set(MyCallback cb);

Post() が期待するものによっては、デリゲートに対しても行う必要がある場合があります。

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void MyCallback(int);

お役に立てれば。

于 2012-10-04T20:12:13.550 に答える