CA2138 : Les méthodes transparentes ne doivent pas appeler les méthodes ayant l'attribut SuppressUnmanagedCodeSecurityCA2138: Transparent methods must not call methods with the SuppressUnmanagedCodeSecurity attribute

TypeNameTypeName TransparentMethodsMustNotCallSuppressUnmanagedCodeSecurityMethodsTransparentMethodsMustNotCallSuppressUnmanagedCodeSecurityMethods
CheckIdCheckId CA2138CA2138
CategoryCategory Microsoft.SecurityMicrosoft.Security
Modification avec ruptureBreaking Change RuptureBreaking

CauseCause

Une méthode transparente de sécurité appelle une méthode marquée avec le SuppressUnmanagedCodeSecurityAttribute attribut.A security transparent method calls a method that is marked with the SuppressUnmanagedCodeSecurityAttribute attribute.

Description de la règleRule description

Cette règle se déclenche sur toute méthode transparente qui appelle directement en code natif, par exemple, à l’aide d’un P/Invoke (non managé) appeler.This rule fires on any transparent method that calls directly into native code, for example, by using a P/Invoke (platform invoke) call. Méthodes P/Invoke et COM interop sont marqués avec le SuppressUnmanagedCodeSecurityAttribute attribut de résultat dans un LinkDemand effectué sur la méthode d’appel.P/Invoke and COM interop methods that are marked with the SuppressUnmanagedCodeSecurityAttribute attribute result in a LinkDemand being done against the calling method. Étant donné 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 des méthodes de classe qui est marquée avec l’attribut SuppressUnmanagedCodeSecurity.Because security transparent code cannot satisfy LinkDemands, the code also cannot call methods that are marked with the SuppressUnmanagedCodeSecurity attribute, or methods of class that is marked with SuppressUnmanagedCodeSecurity attribute. La méthode échoue, ou à la demande sera convertie en une demande complète.The method will fail, or the demand will be converted to a full demand.

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.Violations of this rule lead to a MethodAccessException in the Level 2 security transparency model, and a full demand for UnmanagedCode in the Level 1 transparency model.

Comment corriger les violationsHow to fix violations

Pour corriger une violation de cette règle, supprimez le SuppressUnmanagedCodeSecurityAttribute d’attribut et marquez la méthode avec le SecurityCriticalAttribute ou SecuritySafeCriticalAttribute attribut.To fix a violation of this rule, remove the SuppressUnmanagedCodeSecurityAttribute attribute and mark the method with the SecurityCriticalAttribute or the SecuritySafeCriticalAttribute attribute.

Quand supprimer les avertissementsWhen to suppress warnings

Ne supprimez aucun avertissement de cette règle.Do not suppress a warning from this rule.

ExempleExample

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

}