在非托管回调的委托中抛出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对象可能会无响应,等待你的代码从回调函数返回(因为你的过程已经死了)。