Udostępnij za pośrednictwem


CA2138: Jawne metody nie mogą wywoływać metod z atrybutem SuppressUnmanagedCodeSecurity

TypeName

TransparentMethodsMustNotCallSuppressUnmanagedCodeSecurityMethods

CheckId

CA2138

Kategoria

Microsoft.Security

Złamanie zmiany

Złamanie

Przyczyna

Metoda przezroczyste zabezpieczeń wywołuje metodę, która jest oznaczone SuppressUnmanagedCodeSecurityAttribute atrybut.

Opis reguły

Ta reguła jest uruchamiany w przejrzysty sposób, który wywołuje bezpośrednio do kodu macierzystego, na przykład przy użyciu P/Invoke (platforma wywołać) wywołania.P/Invoke i COM wydajnej metody, które są oznaczone SuppressUnmanagedCodeSecurityAttribute atrybutu wynik w LinkDemand komunikującymi się przeciwko metody wywołującej.Ponieważ przejrzysty kod zabezpieczeń nie może spełnić LinkDemands, kod również nie można wywołać metody, które są oznaczone atrybutem SuppressUnmanagedCodeSecurity lub metody klasy, który jest oznaczony atrybutem SuppressUnmanagedCodeSecurity.Metoda nie powiedzie się lub zapotrzebowania zostaną przekonwertowane na pełnego numeru na żądanie.

Naruszenie tej zasady prowadzić do MethodAccessException w modelu 2 poziom zabezpieczeń przejrzystości i pełnego numeru na żądanie dla UnmanagedCode w modelu 1 poziom przezroczystości.

Jak naprawić naruszenia

Aby rozwiązać naruszenie tej zasady, Usuń SuppressUnmanagedCodeSecurityAttribute atrybutu i oznaczyć metodą z SecurityCriticalAttribute lub SecuritySafeCriticalAttribute atrybut.

Kiedy do pomijania ostrzeżenia

Nie pomijaj ostrzeżenie od tej reguły.

Przykład

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

}