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++/CLI 和 C#)使用单个 C# 库来捕获异常。这会注册各种处理程序(AppDomain.CurrentDomain.UnhandledException、SetUnhandledExceptionFilter 等)并捕获大多数异常。

但是,它不会捕获纯虚拟调用错误,因此我们需要注册上述函数。

4

1 回答 1

1

经过反复试验,我发现引用msvcr100d.dll (d = debug) 而不是 msvcr100.dll 就像我在调试器下一样工作。

这是我的来源(我不知道这是否是好的做法,但我已经在调试/发布模式下成功测试):

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 回答