Share via


CA2138: Los métodos transparentes no deben llamar a métodos con el atributo SuppressUnmanagedCodeSecurity

Elemento Valor
RuleId CA2138
Category Microsoft.Security
Cambio importante Problemático

Causa

Un método transparente de seguridad llama a un método marcado con el atributo SuppressUnmanagedCodeSecurityAttribute.

Nota

Esta regla está en desuso. Para más información, consulte Reglas en desuso.

Descripción de la regla

Esta regla se activa en cualquier método transparente que llame directamente al código nativo, por ejemplo, mediante una llamada P/Invoke (invocación de plataforma). Los métodos de interoperabilidad P/Invoke y COM marcados con el atributo SuppressUnmanagedCodeSecurityAttribute dan lugar a que se realice un LinkDemand contra el método de llamada. Dado que el código transparente de seguridad no puede satisfacer LinkDemands, el código tampoco puede llamar a métodos marcados con el atributo SuppressUnmanagedCodeSecurity o métodos de clase marcados con el atributo SuppressUnmanagedCodeSecurity. Se producirá un error en el método o la demanda se convertirá en una demanda completa.

Las infracciones de esta regla tienen como resultado MethodAccessException en el modelo de transparencia de nivel 2 y una demanda completa de UnmanagedCode en el modelo de transparencia de nivel 1.

Cómo corregir infracciones

Para corregir una infracción de esta regla, quite el atributo SuppressUnmanagedCodeSecurityAttribute y marque el método con el atributo SecurityCriticalAttribute o SecuritySafeCriticalAttribute.

Cuándo suprimir las advertencias

No suprima las advertencias de esta regla.

Ejemplo

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

}