mio codice C# utilizza la rappresentazione chiamando funzioni Win32 tramite P/InvokePerché l'eccezione del codice rappresentato non viene rilevata?
internal class Win32Native
{
[DllImport("advapi32.dll", SetLastError = true)]
public static extern int ImpersonateLoggedOnUser(IntPtr token);
[DllImport("advapi32.dll", SetLastError = true)]
public static extern int RevertToSelf();
}
try {
var token = obtainTokenFromLogonUser();
Win32Native.ImpersonateLoggedOnUser(token);
throw new Exception(); // this is for simulation
Win32Native.RevertToSelf()
} catch(Exception e) {
LogException(e);
throw;
}
anche io ho AppDomain.CurrentDomain.UnhandledException
gestore installata che registra anche tutti un'eccezione non gestita.
Sono sicuro che il codice che registra le eccezioni funziona bene con e senza rappresentazione.
Ora il problema è che nel codice precedente sembra che catch
non sia stato immesso e anche UnhandledException
non venga chiamato. L'unica traccia dell'eccezione è una voce nel Visualizzatore eventi.
Se posso aggiungere un finally
come questo:
try {
var token = obtainTokenFromLogonUser();
Win32Native.ImpersonateLoggedOnUser(token);
try {
throw new Exception(); // this is for simulation
} finally {
Win32Native.RevertToSelf()
}
} catch(Exception e) {
LogException(e);
throw;
}
quindi l'eccezione viene registrato bene sia da catch
e dalle UnhandledException
gestore.
Cosa sta succedendo? Il thread che viene impersonato impedisce la normale gestione delle eccezioni?
se si inserisce un punto di interruzione in 'LogException': ci si arriva? –
@MarcGravell: non lo so, non ci sono debugger in cui questo viene riprodotto. Mi rendo conto che potrebbe esserci qualche problema con 'LogException()' stesso, ma finora il codice su cui si basa funziona bene sia impersonato che non impersonato. – sharptooth
Ecco una supposizione: dato che .NET tiene traccia del contesto di esecuzione, la gestione delle eccezioni potrebbe rendersi conto che il contesto è cambiato e impedisce l'esecuzione del gestore delle eccezioni a meno che il ripristino non venga eseguito per primo. In caso contrario, si otterrebbe un elevazione dei privilegi se il codice dovesse essere eseguito con l'utente rappresentato ... –