2011-10-20 24 views
5

tengo el siguiente código en mi aplicación:análisis de código 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); 

estoy recibiendo el siguiente aviso de análisis de código (FxCop):

CA1060: Microsoft.Design: Porque es un método P/Invoke, 'IconHelper.GetWindowLong (IntPtr, int)' se debe definir en una clase llamada NativeMethods, SafeNativeMethods o UnsafeNativeMethods.

¿Alguien me puede decir en qué clase debo ponerlos? No sé si es Native, SafeNative o UnsafeNative.

+0

posible duplicado de [Cómo saber si el método nativo es seguro/inseguro?] (Http://stackoverflow.com/questions/4511418/how-to-know-if-native -method-is-safe-insafe) – dtb

+2

[FAQ: ¿Cómo corrijo una violación de MovePInvokesToNativeMethodsClass?] (http://blogs.msdn.com/b/codeanalysis/archive/2007/01/14/faq-how- do-i-fix-a-violation-of-movepinvokestonativemethodsclass.aspx) – dtb

Respuesta

4

probarlos todos en movimiento en una clase NativeMethod, que va a resolver el problema

El código debería tener este aspecto después de la fijación que

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

Recuerde que cambiar todos los lugares donde se están llamando a estos métodos

Antes del cambio

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

debe ser

+1

¿No deberían ser públicos los métodos? – JohnSaps

+0

En el código anterior, los métodos deben ser "internos". Advertencia de aumento "público" "CA1401 P/Invocaciones no debería ser visible" – Sielu

Cuestiones relacionadas