2010-02-26 11 views
9

mi chiamano funzione C++ da C# progetto:Prova non cattura un'eccezione in funzione DllImport

[System.Runtime.InteropServices.DllImport("C.dll")] 
public static extern int FillSlist(out string slist); 

e poi

try 
{ 
    FillSlist(out slist); 
} 
catch 
{ 
} 

C dll ++ è protetto da strumento di terze parti, in modo da po 'di codice è essere eseguito prima che FillSlist sia realmente eseguito. Succede qualcosa di veramente brutto mentre viene eseguito questo codice di terze parti e il programma smette di funzionare. Né "try" isola il problema né "AppDomain.CurrentDomain.UnhandledException" viene eseguito.

C'è qualcosa che può aiutare a isolare il crash della funzione C++ dal codice di chiamata C#?

+0

Ho lo stesso problema su .NET Compact Framework 3.5 in Windows CE. Hai trovato qualche soluzione? – kmalmur

risposta

15

È in esecuzione su CLR 4.0? In caso affermativo ...

Se un'eccezione non viene rilevata in un blocco catch aperto come dimostrato nel codice, è perché il CLR lo considera un'eccezione di stato danneggiata e per impostazione predefinita non è gestito dal codice utente. Invece si propaga e causa la fine del processo.

Fa questo per un motivo per questi tipi di eccezioni, non esiste un codice gestito dall'azione per correggere il problema. L'unica soluzione possibile è terminare il processo.

È possibile sovrascrivere questo comportamento aggiungendo un attributo HandledCorruptedStateException al metodo. Ma in generale questa è una cattiva idea.

Maggiori dettagli

Se poi non è possibile che il programma è semplicemente arrestandosi in codice nativo e l'esecuzione non restituisce correttamente al codice gestito.

+0

Grazie, Jared. Questo è CLR 3.5 e C++ non gestito. – Alex

+0

Qualche idea perché succede in CLR 3.5? – kmalmur

+0

Ho appena ricevuto questo errore: .NET 3.5 chiamando C++ dll; l'eccezione generata da DLL causa l'arresto anomalo della mia app C#. Forse mi manca qualcosa qui, ma il collegamento che hai fornito sembra solo dare una soluzione per .NET 4.0. C'è un modo per proteggere da eccezioni nella DLL C++ in 3.5? –

Problemi correlati