Partager via


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

Voir aussi

Autres ressources

Interopération avec du code non managé