在非托管回调的委托中抛出exception的含义
在非托管回调期间使用的委托中抛出exception会产生什么影响或未被感知的后果? 这是我的情况:
非托管C:
int return_callback_val(int (*callback)(void)) { return callback(); }
管理C#:
[DllImport("MyDll.dll")] static extern int return_callback_val(IntPtr callback); [UnmanagedFunctionPointer(CallingConvention.Cdecl)] delegate int CallbackDelegate(); int Callback() { throw new Exception(); } void Main() { CallbackDelegate delegate = new CallbackDelegate(Callback); IntPtr callback = Marshal.GetFunctionPointerForDelegate(delegate); int returnedVal = return_callback_val(callback); }
本机代码将对未处理的exception进行炸弹,程序终止。
如果您确实想要处理该exception,那么您需要在本机代码中使用自定义__try/__catch
关键字 。 这是无用的,托管exception的所有细节都将丢失。 唯一的区别特征是exception代码0xe0434f4d。 由于您无法确切地知道出了什么问题,因此您无法可靠地恢复程序状态。 最好不要抓住它。 或者最好不要抛弃它。
我认为对COM对象说出exception的正确方法就是返回HRESULT.E_FAIL。
无法立即测试它,但我认为如果COM对象在另一个进程中,你所要做的就是杀死你的进程,COM对象可能会无响应,等待你的代码从回调函数返回(因为你的过程已经死了)。