2011-11-29 83 views
5

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

非托管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); 
} 
+0

当你尝试时会发生什么? –

回答

7

本地代码将炸毁未处理的异常,程序终止。

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

0

我认为正确的方式对你说有一个例外是简单地返回HRESULT COM对象。 E_FAIL。

现在无法对其进行测试,但我认为如果COM对象在另一个进程中,您所要做的就是杀死进程,并且COM对象可能无响应,等待您的代码从回调中返回功能(因为你的过程已经死了)。

+0

这不是一个COM对象。 –