2011-10-20 23 views
5

ho il seguente codice nella mia domanda:analisi del codice CA1060 Fix

[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); 

Sto ottenendo il seguente avviso da analisi del codice (FxCop):

CA1060: Microsoft.Design: Perché è un metodo P/Invoke, 'IconHelper.GetWindowLong (IntPtr, int)' deve essere definito in una classe denominata NativeMethods, SafeNativeMethods o UnsafeNativeMethods.

Qualcuno può dirmi in quale classe dovrei inserirli? Non so se si tratta di Native, SafeNative o UnsafeNative.

+0

possibile duplicato di [Come sapere se il metodo nativo è sicuro/insicuro?] (Http://stackoverflow.com/questions/4511418/how-to-know-if-native -metodo-non-sicuro-non sicuro) – dtb

+2

[FAQ: Come posso correggere una violazione di MovePInvokesToNativeMethodsClass?] (http://blogs.msdn.com/b/codeanalysis/archive/2007/01/14/faq-how- do-i-fix-a-violation-of-movepinvokestonativemethodsclass.aspx) – dtb

risposta

4

provarli tutti in movimento in una classe NativeMethod, che possa risolvere il problema

Il codice dovrebbe essere simile a questo dopo aver fissato lo

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); 
} 

ricordarsi di cambiare tutti i luoghi in cui si chiamano questi metodi

Prima del cambio

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

dovrebbe essere

+1

I metodi non dovrebbero essere pubblici? – JohnSaps

+0

Nel codice sopra i metodi dovrebbero essere "interni". Avviso di avviso "pubblico" "CA1401 P/Invocati non visibile" – Sielu