我的 C# 代码通过 P/Invoke 调用 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
处理程序和处理程序都可以正常记录。
发生了什么?被模拟的线程是否会阻止通常的异常处理?