2011-10-20 71 views
5

我在我的應用程序下面的代碼:代碼分析CA1060修復

[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或UnsafeNativeMethods的類 中定義。

有人可以告訴我我應該放哪個班嗎?我不知道它是Native,SafeNative還是UnsafeNative。

+0

的可能重複[如何知道本機方法是安全/不安全?](http://stackoverflow.com/questions/4511418/how-to-know-if-native - 方法是安全不安全的) – dtb

+2

[常見問題:如何解決MovePInvokesToNativeMethodsClass違規問題?](http://blogs.msdn.com/b/codeanalysis/archive/2007/01/14/faq-how- do-i-fix-a-violation-of-movepinvokestonativemethodsclass.aspx) – dtb

回答

4

嘗試全部移動到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) 

應該

+1

這些方法不應該公開嗎? – JohnSaps

+0

在上面的代碼方法應該是「內部的」。 「公開」引發警告「CA1401 P/Invokes不應該可見」 – Sielu