我使用时遇到问题_set_purecall_handler使用 C# 中的 P/Invoke。
基本上,这有效:
(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 等)并捕获大多数异常。
但是,它不能捕获纯虚拟调用错误,因此我们需要注册上述函数。
经过反复试验,我发现引用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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)