CA1415 : Déclarer correctement les méthodes P/Invoke
TypeName |
DeclarePInvokesCorrectly |
CheckId |
CA1415 |
Catégorie |
Microsoft.Interoperability |
Modification avec rupture |
Sans rupture - Si P/Invoke qui déclare le paramètre n'est pas visible à l'extérieur de l'assembly. Avec rupture - si le P/Invoke qui déclare le paramètre est visible à l'extérieur de l'assembly. |
Cause
Une méthode d'appel de code non managé est déclarée de manière incorrecte.
Description de la règle
Une méthode d'appel de code non managé accède à un code non managé et est définie à l'aide du mot clé Declare en Visual Basic ou de l'attribut System.Runtime.InteropServices.DllImportAttribute. Cette règle recherche actuellement des déclarations de méthode d'appel de code non managé qui ciblent des fonctions Win32 présentant un pointeur vers un paramètre de structure OVERLAPPED, et le paramètre managé correspondant n'est pas un pointeur vers une structure System.Threading.NativeOverlapped.
Comment corriger les violations
Pour corriger une violation de cette règle, déclarez correctement la méthode d'appel de code non managé.
Quand supprimer les avertissements
Ne supprimez aucun avertissement de cette règle.
Exemple
L'exemple suivant présente des méthodes d'appel de code non managé qui enfreignent et respectent la règle.
using System;
using System.Runtime.InteropServices;
using System.Threading;
namespace InteroperabilityLibrary
{
// The platform invoke methods in this class violate the rule.
[ComVisible(true)]
internal class NativeMethods
{
private NativeMethods() { }
[DllImport("kernel32.dll", SetLastError = true)]
internal extern static uint ReadFile(
IntPtr hFile, IntPtr lpBuffer, int nNumberOfBytesToRead,
IntPtr lpNumberOfBytesRead, IntPtr overlapped);
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
internal extern static bool ReadFileEx(
IntPtr hFile, IntPtr lpBuffer, int nNumberOfBytesToRead,
NativeOverlapped overlapped, IntPtr lpCompletionRoutine);
}
// The platform invoke methods in this class satisfy the rule.
[ComVisible(true)]
internal class UnsafeNativeMethods
{
private UnsafeNativeMethods() { }
//To compile this code, uncomment these lines and compile
//with "/unsafe".
//[DllImport("kernel32.dll", SetLastError = true)]
//unsafe internal extern static uint ReadFile(
// IntPtr hFile, IntPtr lpBuffer, int nNumberOfBytesToRead,
// IntPtr lpNumberOfBytesRead, NativeOverlapped* overlapped);
//[DllImport("kernel32.dll", SetLastError = true)]
//[return: MarshalAs(UnmanagedType.Bool)]
//unsafe internal extern static bool ReadFileEx(
// IntPtr hFile, IntPtr lpBuffer, int nNumberOfBytesToRead,
// NativeOverlapped* overlapped, IntPtr lpCompletionRoutine);
}
}