CA1414 : Marquer les arguments P/Invoke booléens comme MarshalAsCA1414: Mark boolean P/Invoke arguments with MarshalAs

TypeNameTypeName MarkBooleanPInvokeArgumentsWithMarshalAsMarkBooleanPInvokeArgumentsWithMarshalAs
CheckIdCheckId CA1414CA1414
CategoryCategory Microsoft.InteroperabilityMicrosoft.Interoperability
Modification avec ruptureBreaking Change RuptureBreaking

CauseCause

Un appel de méthode déclaration inclut un System.Boolean paramètre ou valeur de retour, mais le System.Runtime.InteropServices.MarshalAsAttribute attribut n’est pas appliqué à la valeur de paramètre ou de retour.A platform invoke method declaration includes a System.Boolean parameter or return value but the System.Runtime.InteropServices.MarshalAsAttribute attribute is not applied to the parameter or return value.

Description de la règleRule description

Une plateforme d’appeler la méthode accède à un code non managé et est définie à l’aide de la Declare mot clé dans Visual BasicVisual Basic ou System.Runtime.InteropServices.DllImportAttribute.A platform invoke method accesses unmanaged code and is defined by using the Declare keyword in Visual BasicVisual Basic or the System.Runtime.InteropServices.DllImportAttribute. MarshalAsAttribute Spécifie le comportement de marshaling est utilisé pour convertir les types de données entre code managé et non managé.MarshalAsAttribute specifies the marshaling behavior that is used to convert data types between managed and unmanaged code. Types de nombreuses données simples, tels que System.Byte et System.Int32, ont une représentation unique dans le code non managé et ne nécessitent pas de spécification de leur comportement de marshaling ; le common language runtime fournit automatiquement le comportement correct.Many simple data types, such as System.Byte and System.Int32, have a single representation in unmanaged code and do not require specification of their marshaling behavior; the common language runtime automatically supplies the correct behavior.

Le Boolean type de données a plusieurs représentations en code non managé.The Boolean data type has multiple representations in unmanaged code. Lorsque le MarshalAsAttribute n’est pas spécifié, la valeur par défaut de marshaling de comportement pour le Boolean est de type de données System.Runtime.InteropServices.UnmanagedType.When the MarshalAsAttribute is not specified, the default marshaling behavior for the Boolean data type is System.Runtime.InteropServices.UnmanagedType. Il s’agit d’un entier 32 bits, ce qui n’est pas approprié dans toutes les circonstances.This is a 32-bit integer, which is not appropriate in all circumstances. La représentation booléenne qui est requis par la méthode non managée doit être déterminée et mis en correspondance avec le texte approprié System.Runtime.InteropServices.UnmanagedType.The Boolean representation that is required by the unmanaged method should be determined and matched to the appropriate System.Runtime.InteropServices.UnmanagedType. UnmanagedType.Bool est du type BOOL Win32, qui est toujours 4 octets.UnmanagedType.Bool is the Win32 BOOL type, which is always 4 bytes. UnmanagedType.U1 doit être utilisé pour C++ bool ou d’autres types de 1 octet.UnmanagedType.U1 should be used for C++ bool or other 1-byte types.

Comment corriger les violationsHow to fix violations

Pour corriger une violation de cette règle, appliquez MarshalAsAttribute à la Boolean paramètre ou valeur de retour.To fix a violation of this rule, apply MarshalAsAttribute to the Boolean parameter or return value. Définissez la valeur de l’attribut approprié UnmanagedType.Set the value of the attribute to the appropriate UnmanagedType.

Quand supprimer les avertissementsWhen to suppress warnings

Ne supprimez aucun avertissement de cette règle.Do not suppress a warning from this rule. Même si le comportement de marshaling par défaut est approprié, le code est plus faciles à gérer lorsque le comportement est spécifié explicitement.Even if the default marshaling behavior is appropriate, the code is more easily maintained when the behavior is explicitly specified.

ExempleExample

L’exemple suivant illustre les méthodes marquées avec le bon code non managé MarshalAsAttribute attributs.The following example shows platform invoke methods that are marked with the appropriate MarshalAsAttribute attributes.

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

CA1901 : Les déclarations P/Invoke doivent être portablesCA1901: P/Invoke declarations should be portable

CA2101 : Spécifier le marshaling pour les arguments de chaîne P/InvokeCA2101: Specify marshaling for P/Invoke string arguments

Voir aussiSee also