Partager via


CA1414 : Marquer les arguments P/Invoke booléens comme MarshalAs

TypeName

MarkBooleanPInvokeArgumentsWithMarshalAs

CheckId

CA1414

Catégorie

Microsoft.Interoperability

Modification avec rupture

Oui

Cause

Une déclaration de méthode d'appel de code non managé contient un paramètre System.Boolean ou une valeur de retour, mais l'attribut System.Runtime.InteropServices.MarshalAsAttribute n'est pas appliqué au paramètre ou à la valeur de retour.

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. MarshalAsAttribute spécifie le comportement de marshaling utilisé pour convertir des types de données entre codes managé et non managé. Plusieurs types de données simples, par exemple System.Byte et System.Int32, ont une représentation unique dans le code non managé et leur comportement de marshaling ne doit pas être spécifié ; le Common Language Runtime fournit automatiquement le comportement correct.

Le type de données Boolean contient plusieurs représentations dans le code non managé. Lorsque MarshalAsAttribute n'est pas spécifié, le comportement de marshaling par défaut pour le type de données Boolean est UnmanagedType.Bool. Il s'agit d'un entier de 32 bits, qui ne convient pas dans toutes les situations. La représentation Boolean requise par la méthode non managée doit être déterminée et mise en correspondance avec le System.Runtime.InteropServices.UnmanagedType approprié. UnmanagedType.Bool est le type Win32 BOOL, qui est toujours de 4 octets. UnmanagedType.U1 doit être utilisé pour C++bool ou d'autres types de 1 octet. Pour plus d'informations, consultez Marshaling par défaut pour les types Boolean.

Comment corriger les violations

Pour corriger une violation de cette règle, appliquez MarshalAsAttribute au paramètre Boolean ou à la valeur de retour. Affectez le UnmanagedType approprié à la valeur de l'attribut.

Quand supprimer les avertissements

Ne supprimez aucun avertissement de cette règle. Même si le comportement de marshaling par défaut est approprié, le code est géré plus facilement lorsque le comportement est spécifié explicitement.

Exemple

L'exemple suivant présente deux méthodes d'appel de code non managé marquées avec les attributs MarshalAsAttribute appropriés.

Imports System
Imports System.Runtime.InteropServices

<assembly: ComVisible(False)>
Namespace UsageLibrary

   <ComVisible(True)> _
   Class NativeMethods

      Private Sub New()
      End Sub

      <DllImport("user32.dll", SetLastError := True)> _
      Friend Shared Function MessageBeep(uType As UInt32) _
         As <MarshalAs(UnmanagedType.Bool)> Boolean
      End Function

      <DllImport("mscoree.dll", SetLastError := True)> _
      Friend Shared Function StrongNameSignatureVerificationEx( _
         <MarshalAs(UnmanagedType.LPWStr)> wszFilePath As String, _
         <MarshalAs(UnmanagedType.U1)> fForceVerification As Boolean, _
         <MarshalAs(UnmanagedType.U1)> ByRef pfWasVerified As Boolean) _
         As <MarshalAs(UnmanagedType.U1)> Boolean
      End Function

   End Class

End Namespace
using System;
using System.Runtime.InteropServices;

[assembly: ComVisible(false)]
namespace InteroperabilityLibrary
{
   [ComVisible(true)]
   internal class NativeMethods
   {
      private NativeMethods() {}

      [DllImport("user32.dll", SetLastError = true)]
      [return: MarshalAs(UnmanagedType.Bool)]
      internal static extern Boolean MessageBeep(UInt32 uType);

      [DllImport("mscoree.dll", 
                 CharSet = CharSet.Unicode, 
                 SetLastError = true)]
      [return: MarshalAs(UnmanagedType.U1)]
      internal static extern bool StrongNameSignatureVerificationEx(
         [MarshalAs(UnmanagedType.LPWStr)] string wszFilePath,
         [MarshalAs(UnmanagedType.U1)] bool fForceVerification,
         [MarshalAs(UnmanagedType.U1)] out bool pfWasVerified);
   }
}
using namespace System;
using namespace System::Runtime::InteropServices;

[assembly: ComVisible(false)];
namespace InteroperabilityLibrary
{
   [ComVisible(true)]
   ref class NativeMethods
   {
   private:
      NativeMethods() {}

   internal:
      [DllImport("user32.dll", SetLastError = true)]
      [returnvalue: MarshalAs(UnmanagedType::Bool)]
      static Boolean MessageBeep(UInt32 uType);

      [DllImport("mscoree.dll", 
                 CharSet = CharSet::Unicode, 
                 SetLastError = true)]
      [returnvalue: MarshalAs(UnmanagedType::U1)]
      static bool StrongNameSignatureVerificationEx(
         [MarshalAs(UnmanagedType::LPWStr)] String^ wszFilePath,
         [MarshalAs(UnmanagedType::U1)] Boolean fForceVerification,
         [MarshalAs(UnmanagedType::U1)] Boolean^ pfWasVerified);
   };
}

Règles connexes

CA1901 : Les déclarations P/Invoke doivent être portables

CA2101 : Spécifiez le marshaling pour les arguments de chaîne P/Invoke

Voir aussi

Référence

System.Runtime.InteropServices.UnmanagedType

Concepts

Marshaling par défaut pour les types Boolean

Autres ressources

Interopération avec du code non managé