代码分析CA1060修复

Kri*_*rip 6 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 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);
Run Code Online (Sandbox Code Playgroud)

我从Code Analysis(FxCop)收到以下警告:

CA1060:Microsoft.Design:因为它是P/Invoke方法,所以应该在名为NativeMethods,SafeNativeMethods或UnsafeNativeMethods的类中定义'IconHelper.GetWindowLong(IntPtr,int)'.

有人可以告诉我应该把它放在哪个班级吗?我不知道它是Native,SafeNative还是UnsafeNative.

Kon*_*man 9

您可以在此处获得有关此警告的详细信息:http://msdn.microsoft.com/en-us/library/ms182161.aspx.简而言之:

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


Vig*_*ian 5

尝试将它们全部移至 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);
}
Run Code Online (Sandbox Code Playgroud)

请记住更改调用这些方法的所有位置

变更前

SendMessage(IntPtr hwnd, uint msg,IntPtr wParam, IntPtr lParam)
Run Code Online (Sandbox Code Playgroud)

应该

NativeMethods.SendMessage(IntPtr hwnd, uint msg,IntPtr wParam, IntPtr lParam)
Run Code Online (Sandbox Code Playgroud)