CA1415 : Déclarer correctement les méthodes P/Invoke

Élément Valeur
ID de la règle CA1415
Category Microsoft.Interoperability
Modification avec rupture Non cassant : si P/Invoke qui déclare le paramètre ne peut pas être visualisé en dehors de l’assembly. Cassant : si P/Invoke qui déclare le paramètre est visible en dehors 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 au code non managé et est définie à l’aide du mot clé Declare dans Visual Basic ou de System.Runtime.InteropServices.DllImportAttribute. Actuellement, cette règle recherche les déclarations de méthode d’appel de plateforme qui ciblent des fonctions Win32 qui ont un pointeur vers un OVERLAPPED paramètre de structure et le paramètre managé correspondant n’est pas un pointeur vers une System.Threading.NativeOverlapped structure.

Comment corriger les violations

Pour corriger toute 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 montre des méthodes d’appel de code non managé conformes et non conformes à 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);
    }
}

Voir aussi

Interopération avec du code non managé