2011-11-29 9 views
5

Quali sono le implicazioni o le conseguenze non percepite di un'eccezione all'interno di un delegato utilizzata durante una richiamata non gestita? Qui è la mia situazione:Implicazioni dell'eccezione di lancio in delegato della richiamata non gestita

non gestito C:

int return_callback_val(int (*callback)(void)) 
{ 
    return callback(); 
} 

Managed 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

Cosa succede quando lo provi? –

risposta

7

Il codice nativo bombarderà l'eccezione non gestita e il programma termina.

Se effettivamente si desidera gestire tale eccezione, è necessario utilizzare il codice personalizzato __try/__catch keywords nel codice nativo. Il che è abbastanza inutile, tutti i dettagli dell'eccezione gestita vanno persi. L'unica caratteristica distintiva è il codice di eccezione, 0xe0434f4d. Dal momento che non puoi sapere esattamente cosa è andato storto, non puoi neanche ripristinare in modo affidabile lo stato del programma. Meglio non prenderlo. O meglio non buttarlo.

0

penso che il modo corretto di dire a un oggetto COM si dispone di un'eccezione è semplicemente quello di restituire HRESULT. E_FAIL.

non potuto provare in questo momento, ma penso che se l'oggetto COM è in un altro processo, tutto quello che farà è di uccidere il processo e l'oggetto COM potrebbe non rispondere, in attesa che il codice per tornare dalla callback funzione (dato che il tuo processo è già morto).

+0

Questo non è un oggetto COM. –