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 de 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 de l’appel de 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 qui est utilisé pour convertir des 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 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 comporte plusieurs représentations dans le code non managé.The Boolean data type has multiple representations in unmanaged code. Lorsque le MarshalAsAttribute n’est pas spécifié, le comportement de marshaling par défaut 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 de 32 bits, ce qui n’est pas approprié dans tous les cas.This is a 32-bit integer, which is not appropriate in all circumstances. La représentation Boolean requise par la méthode non managée doit être déterminée et mis en correspondance avec les 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 le type BOOL Win32, qui est toujours de 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 à le Boolean paramètre ou valeur de retour.To fix a violation of this rule, apply MarshalAsAttribute to the Boolean parameter or return value. 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 géré plus facilement 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 montre deux méthodes sont marquées avec approprié d’appel de code MarshalAsAttribute attributs.The following example shows two 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écifiez le marshaling pour les arguments de chaîne P/InvokeCA2101: Specify marshaling for P/Invoke string arguments

Voir aussiSee Also

System.Runtime.InteropServices.UnmanagedType
Interopération avec du code non managéInteroperating with Unmanaged Code