Partager via


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

TypeName

TransparentMethodsMustNotCallSuppressUnmanagedCodeSecurityMethods

CheckId

CA2138

Catégorie

Microsoft.Security

Modification avec rupture

Oui

Cause

Une méthode transparente de sécurité appelle une méthode marquée avec l'attribut SuppressUnmanagedCodeSecurityAttribute.

Description de la règle

Cette règle déclenche sur toute méthode transparente qui fait directement appel au code natif, par exemple via un appel P/Invoke (appel de code). Les méthodes P/Invoke et COM Interop marquées avec l'attribut SuppressUnmanagedCodeSecurityAttribute produisent un LinkDemand effectué sur la méthode d'appel. Parce que le code transparent de sécurité ne peut pas satisfaire LinkDemands, le code ne peut pas également appeler les méthodes marquées avec l'attribut SuppressUnmanagedCodeSecurity, ou les méthodes de classe marquée avec l'attribut SuppressUnmanagedCodeSecurity. La méthode échouera ou la demande sera convertie en demande complète.

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

Comment corriger les violations

Pour résoudre 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);
        }
    }

}