我想了解为什么我的代码中会出现两个 CA 警告:
CA2000在失去范围之前处置对象 在方法“ImpersonateValidUser(string, string, string, LogOnType, LogOnProvider, ImpersonationLevel)”中,在对对象“tempWindowsIdentity”的所有引用超出范围之前调用 System.IDisposable.Dispose。
CA1404在调用 GetLastWin32Error的 P/Invoke 方法“ImpersonateValidUser(string, string, string, LogOnType, LogOnProvider, ImpersonationLevel)”之后立即调用 GetLastError,但之前对“IDisposable.Dispose()”的调用不是 P/Invoke 语句。将调用移至 GetLastWin32Error,使其紧跟相关平台调用调用。
下面是简化的代码示例,在警告出现的地方精确地注释了行:
private static void Impersonate(string userName, string domain, string password, LogOnType logonType, LogOnProvider logonProvider, ImpersonationLevel impersonationLevel)
{
var token = IntPtr.Zero;
var tokenDuplicate = IntPtr.Zero;
if (NativeMethods.RevertToSelf())
{
if (NativeMethods.LogonUser(userName, domain, password, (int)logonType, (int)logonProvider, ref token) != 0)
{
if (NativeMethods.DuplicateToken(token, (int)impersonationLevel, ref tokenDuplicate) != 0)
{
/* CA2000 */ using (var tempWindowsIdentity = new WindowsIdentity(tokenDuplicate))
{
_impersonationContext = tempWindowsIdentity.Impersonate();
return;
}
}
}
}
/* CA1404 */ var e = Marshal.GetLastWin32Error();
throw new Win32Exception(e);
}
CA2000 -语句完成tempWindowsIdentity
后未使用对象using()
,为什么会出现此警告?
CA1404 -Marshal.GetLastWin32Error()
总是在本机方法之后调用。即使using()
之前调用了情况语句,该return
子句也会出现,因此Marshal.GetLastWin32Error()
不会被调用,那么为什么会出现这个警告?