C# 在非托管回调的委托中引发异常的含义

C# 在非托管回调的委托中引发异常的含义,c#,.net,exception,pinvoke,C#,.net,Exception,Pinvoke,在非托管回调期间使用的委托内部引发异常的含义或未察觉的后果是什么?以下是我的情况: 非托管C: int return_callback_val(int (*callback)(void)) { return callback(); } 托管C#: 我认为对COM对象说您有异常的正确方法是简单地返回HRESULT.E_FAIL 现在无法测试它,但我认为如果COM对象在另一个进程中,您所要做的就是终止您的进程,COM对象可能会变得无响应,等待您的代码从回调函数返回(因为您的进程已经死了).本机

在非托管回调期间使用的委托内部引发异常的含义或未察觉的后果是什么?以下是我的情况:

非托管C:

int return_callback_val(int (*callback)(void))
{
  return callback();
}
托管C#:


我认为对COM对象说您有异常的正确方法是简单地返回HRESULT.E_FAIL


现在无法测试它,但我认为如果COM对象在另一个进程中,您所要做的就是终止您的进程,COM对象可能会变得无响应,等待您的代码从回调函数返回(因为您的进程已经死了).

本机代码将轰炸未处理的异常,程序终止


如果您确实想要处理该异常,那么您需要在本机代码中使用自定义。这是非常无用的,托管异常的所有细节都丢失了。唯一的区别特征是异常代码0xe0434f4d。由于您无法确切地知道发生了什么错误,因此也无法可靠地恢复程序状态。最好不要抓住它。或者最好不要扔掉它。

尝试时会发生什么?
[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);
}