C# 代码分析CA1060修复程序

C# 代码分析CA1060修复程序,c#,code-analysis,fxcop,C#,Code Analysis,Fxcop,我的应用程序中有以下代码: [DllImport("user32.dll")] private static extern int GetWindowLong(IntPtr hwnd, int index); [DllImport("user32.dll")] private static extern int SetWindowLong(IntPtr hwnd, int index, int newStyle); [DllImport("user32.dll")] private stat

我的应用程序中有以下代码:

[DllImport("user32.dll")]
private static extern int GetWindowLong(IntPtr hwnd, int index);

[DllImport("user32.dll")]
private static extern int SetWindowLong(IntPtr hwnd, int index, int newStyle);

[DllImport("user32.dll")]
private static extern bool SetWindowPos(IntPtr hwnd, IntPtr hwndInsertAfter,
               int x, int y, int width, int height, uint flags);

[DllImport("user32.dll")]
private static extern IntPtr SendMessage(IntPtr hwnd, uint msg,
               IntPtr wParam, IntPtr lParam);
我从代码分析(FxCop)中得到以下警告:

CA1060:Microsoft.Design:因为它是一个p/Invoke方法, 应在类中定义“IconHelper.GetWindowLong(IntPtr,int)” 命名的NativeMethods、SafeNativeMethods或UnsafentiveMethods


有人能告诉我应该把它们放在哪一类吗?我不知道它是本机的、安全的还是非防护性的。

您在这里有关于此警告的详细信息:。简言之:

对于大多数应用程序,将p/Invokes移动到名为NativeMethods的新类就足够了


尝试将它们全部移动到NativeMethod类中,这样可以解决问题

修复后的代码应该是这样的

public class NativeMethods {
[DllImport("user32.dll")]
private static extern int GetWindowLong(IntPtr hwnd, int index);

[DllImport("user32.dll")]
private static extern int SetWindowLong(IntPtr hwnd, int index, int newStyle);

[DllImport("user32.dll")]
private static extern bool SetWindowPos(IntPtr hwnd, IntPtr hwndInsertAfter,
               int x, int y, int width, int height, uint flags);

[DllImport("user32.dll")]
private static extern IntPtr SendMessage(IntPtr hwnd, uint msg,
               IntPtr wParam, IntPtr lParam);
}
记住更改调用这些方法的所有位置

变动前

SendMessage(IntPtr hwnd, uint msg,IntPtr wParam, IntPtr lParam)
应该是

NativeMethods.SendMessage(IntPtr hwnd, uint msg,IntPtr wParam, IntPtr lParam)

可以通过定义

<PropertyGroup> 
..... 
     <NoWarn>CA1060</NoWarn>
..... 
</PropertyGroup>

..... 
CA1060
..... 

在配置文件(.csproj文件)中。

可能重复的方法不应该是公共的吗?在上述代码中,方法应该是“内部的”。“Public”raise warning“ca1401p/Invokes不应可见”将其变为静态类也很明智(您只是将方法放在该类中,而不是在其中保存任何状态)。因此,您的类声明类似于
内部静态类NativeMethods{…