2011-11-29 69 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對象。 –