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
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour