我在 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++/CLI 和 C#)使用单个 C# 库来捕获异常。这会注册各种处理程序(AppDomain.CurrentDomain.UnhandledException、SetUnhandledExceptionFilter 等)并捕获大多数异常。
但是,它不会捕获纯虚拟调用错误,因此我们需要注册上述函数。