在C#中使用_set_purecall_handler与P/Invoke时遇到问题。在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/Inv oke方法签名是正确的,但是当我调用函数时它不会抛出任何错误(它只是不会在纯虚拟调用错误时触发回调)。
背景
我们有一个数字,用一个C#库,用于捕获异常的应用程序(C++,C++/CLI和C#)的。这注册了各种处理程序(AppDomain.CurrentDomain.UnhandledException,SetUnhandledExceptionFilter等)并捕获大多数异常。
但是,它不会捕获纯虚拟调用错误,因此我们需要注册上述函数。
你百分之百确定你的C#被调用到C运行库的相同实例与调用纯虚函数的C++代码相同吗? – 2012-07-25 12:22:02
大卫,我们已经P/Invoke一些kernel32.dll函数,成功拦截C++中的错误(SetUnhandledExceptionFilter,SetProcessUserModeExceptionPolicy,...)但之前没有导入msvcr100.dll。这不应该是一样的吗? – Dunc 2012-07-25 13:30:48
您可能没有获得与您的本机代码相同的C++运行时。但那很可能是一条红鲱鱼。 – 2012-07-25 13:33:23