Marquer des arguments P/Invoke booléens avec MarshalAs
Mise à jour : novembre 2007
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 au code non managé et est définie à l'aide du mot clé Declare en Visual Basic ou de System.Runtime.InteropServices.DllImportAttribute. MarshalAsAttribute spécifie le comportement de marshaling utilisé pour convertir des types de données entre du code 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
Les déclarations P/Invoke doivent être portables
Spécifier le marshaling pour les arguments de chaîne P/Invoke
Voir aussi
Concepts
Marshaling par défaut pour les types Boolean
Référence
System.Runtime.InteropServices.UnmanagedType