gpt4 book ai didi

c# - CA1404 - 尽管语句前面有 return 子句,CA2000 - 尽管没有进一步的引用用法

转载 作者:太空狗 更新时间:2023-10-29 23:53:31 25 4
gpt4 key购买 nike

我想了解为什么我的代码中会出现两个 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 - using() 语句完成后未使用对象 tempWindowsIdentity,那么为什么会出现此警告?

CA1404 - Marshal.GetLastWin32Error() 总是在 native 方法之后被调用。即使有情况 using() 语句被调用之前,return 子句出现,所以 Marshal.GetLastWin32Error() 不会被调用,那么为什么会出现这个警告?

最佳答案

我相信 CA2000 发生是因为您违反了规则的以下部分,这意味着您在 using 语句中创建了一个一次性对象;

Returning a disposable object requires that the object is constructed in a try/finally block outside a using block.

CA1404 也会发生,因为您没有在 native 调用后立即调用 Marshal.GetLastWin32Error();。尝试在每个 if 语句中调用 Marshal.GetLastWin32Error(); 作为代码中的第一项。

关于c# - CA1404 - 尽管语句前面有 return 子句,CA2000 - 尽管没有进一步的引用用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14456784/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com