私のコードに 2 つの CA 警告が表示される理由を理解したいと思います。
CA2000スコープを失う前にオブジェクトを破棄 メソッド 'ImpersonateValidUser(string, string, string, LogOnType, LogOnProvider, ImpersonationLevel)' で、オブジェクトへのすべての参照がスコープ外になる前に、オブジェクト 'tempWindowsIdentity' で System.IDisposable.Dispose を呼び出します。
CA1404 P/Invoke メソッド 'ImpersonateValidUser(string, string, string, LogOnType, LogOnProvider, ImpersonationLevel)' が GetLastWin32Error を呼び出した直後に 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()
され、その後呼び出されないのに、なぜこの警告が表示されるのでしょうか。