我的C#代碼使用模擬由通過P調用Win32函數/調用爲什麼來自模擬代碼的異常未被捕獲?
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;
}
還我AppDomain.CurrentDomain.UnhandledException
處理程序安裝還記錄所有未處理的異常。
我敢肯定,記錄異常的代碼在使用和不使用模擬時都可以正常工作。
現在的問題是,在上面的代碼中,它看起來像沒有輸入catch
,UnhandledException
也沒有被調用。事件查看器中的條目是唯一的異常跟蹤。
如果我添加一個finally
這樣的:
try {
var token = obtainTokenFromLogonUser();
Win32Native.ImpersonateLoggedOnUser(token);
try {
throw new Exception(); // this is for simulation
} finally {
Win32Native.RevertToSelf()
}
} catch(Exception e) {
LogException(e);
throw;
}
則異常無論從catch
和UnhandledException
處理記錄好。
發生了什麼事?被模擬的線程是否阻止了常規的異常處理?
如果你在'LogException'上放置一個斷點:你到那裏了嗎? – 2013-03-15 10:02:18
@MarcGravell:我不知道,沒有調試器在哪裏複製。我意識到'LogException()'本身可能存在一些問題,但到目前爲止,它所依賴的代碼都可以正常工作,並且不會被模擬。 – sharptooth 2013-03-15 10:04:12
在這裏做一個猜測:因爲.NET會跟蹤執行上下文,所以異常處理可能會意識到上下文已經改變,並且正在阻止異常處理程序執行,除非首先執行回覆。如果代碼與模擬用戶一起運行,則不這樣做會導致特權提升...... – 2013-03-15 12:26:11