1

C#でP/Invokeで_set_purecall_handlerを使用するのに問題があります。

基本的に、これは機能します。

(C ++)

_set_purecall_handler(MyPureCallHandler);

void MyPureCallHandler(void)
{
    // gets called
}

しかし、これはしません:

(C#)

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate void PureCallHandler();

[DllImport("msvcr100.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern IntPtr _set_purecall_handler([MarshalAs(UnmanagedType.FunctionPtr)] PureCallHandler handler);

_set_purecall_handler(MyPureCallHandler);

private void MyPureCallHandler()
{
    // *** doesn’t get called ***
}

P / Invokeメソッドのシグネチャが正しいかどうかはわかりませんが、関数を呼び出してもエラーはスローされません(純粋な仮想呼び出しエラーでコールバックが発生しないだけです)。

バックグラウンド

例外をキャッチするために単一のC#ライブラリを使用する多数のアプリ(C ++、C ++ / CLI、およびC#)があります。これにより、さまざまなハンドラー(AppDomain.CurrentDomain.UnhandledException、SetUnhandledExceptionFilterなど)が登録され、ほとんどの例外がキャッチされます。

ただし、純粋仮想呼び出しエラーはキャッチしないため、上記の関数を登録する必要があります。

4

1 に答える 1

1

試行錯誤の末、 msvcr100.dllの代わりにmsvcr100d.dll(d = debug)を参照すると、デバッガーの下で機能することがわかりました。

これが私のソースです(これが良い習慣かどうかはわかりませんが、デバッグ/リリースモードで正常にテストしました):

private const string DllName =
    #if DEBUG
        "msvcr100d.dll";
    #else
        "msvcr100.dll"; 
    #endif

public delegate void PureCallHandler();

[DllImport(DllName, CallingConvention = CallingConvention.Cdecl)]
public static extern PureCallHandler _set_purecall_handler(PureCallHandler handler);
于 2012-07-25T17:02:17.950 に答える