在非托管回调的委托中抛出异常的含义

ken*_*ken 5 .net c# pinvoke exception

在非托管回调期间使用的委托内部抛出异常有什么影响或未被察觉的后果?这是我的情况:

非托管C:

int return_callback_val(int (*callback)(void))
{
  return callback();
}
Run Code Online (Sandbox Code Playgroud)

管理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);
}
Run Code Online (Sandbox Code Playgroud)

Han*_*ant 7

本机代码将对未处理的异常进行炸弹,程序终止.

如果您确实想要处理该异常,则需要在本机代码中使用自定义__try/__catch关键字.这是无用的,托管异常的所有细节都将丢失.唯一的区别特征是异常代码0xe0434f4d.由于您无法准确知道出现了什么问题,因此无法可靠地恢复程序状态.最好不要抓住它.或者最好不要抛弃它.