CA2138 : Les méthodes transparentes ne doivent pas appeler les méthodes ayant l'attribut SuppressUnmanagedCodeSecurity

Élément Valeur
ID de la règle CA2138
Category Microsoft.Security
Modification avec rupture Rupture

Cause

Une méthode transparente de sécurité appelle une méthode qui est marquée à l’aide de l’attribut SuppressUnmanagedCodeSecurityAttribute.

Notes

Cette règle est déconseillée. Pour plus d’informations, consultez Règles dépréciées.

Description de la règle

Cette règle se déclenche sur toute méthode transparente qui appelle le code natif, par exemple, à l’aide d’un appel P/Invoke (appel de plateforme). Les méthodes d’interopérabilité P/Invoke et COM marquées avec l’attribut SuppressUnmanagedCodeSecurityAttribute entraînent l’exécution d’un objet LinkDemand sur la méthode appelante. Étant donné que le code transparent de sécurité ne peut pas satisfaire LinkDemands, le code ne peut pas non plus appeler des méthodes marquées avec l’attribut SuppressUnmanagedCodeSecurity ou des méthodes de classe marquées avec l’attribut SuppressUnmanagedCodeSecurity. La méthode échoue ou la demande est convertie en demande complète.

Les violations de cette règle provoquent une exception MethodAccessException dans le modèle de transparence de niveau de sécurité 2, et une demande complète pour le code UnmanagedCode dans le modèle de transparence de niveau 1.

Comment corriger les violations

Pour corriger une violation de cette règle, supprimez l’attribut SuppressUnmanagedCodeSecurityAttribute et marquez la méthode avec l’attribut SecurityCriticalAttribute ou SecuritySafeCriticalAttribute.

Quand supprimer les avertissements

Ne supprimez aucun avertissement de cette règle.

Exemple

using System;
using System.Runtime.InteropServices;
using System.Security;


namespace TransparencyWarningsDemo
{

    public class CallSuppressUnmanagedCodeSecurityClass
    {
        [SuppressUnmanagedCodeSecurity]
        [DllImport("kernel32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool Beep(uint dwFreq, uint dwDuration);

        public void CallNativeMethod()
        {
            // CA2138 violation - transparent method calling a method marked with SuppressUnmanagedCodeSecurity
            // (this is also a CA2149 violation as well, since this is a P/Invoke and not an interface call).
            Beep(10000, 1);
        }
    }

}