Udostępnij za pośrednictwem


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

Pozycja Wartość
Ruleid CA2138
Kategoria Microsoft.Security
Zmiana powodująca niezgodność Kluczowa

Przyczyna

Przezroczysta metoda zabezpieczeń wywołuje metodę oznaczoną atrybutem SuppressUnmanagedCodeSecurityAttribute .

Uwaga

Ta reguła została przestarzała. Aby uzyskać więcej informacji, zobacz Przestarzałe reguły.

Opis reguły

Ta reguła jest uruchamiana w dowolnej przezroczystej metodzie, która wywołuje bezpośrednio kod natywny, na przykład przy użyciu wywołania P/Invoke (wywołania platformy). Metody międzyoperacyjnych P/Invoke i COM oznaczone atrybutem SuppressUnmanagedCodeSecurityAttribute powodują wykonanie polecenia LinkDemand względem metody wywołującej. Ponieważ kod przezroczysty zabezpieczeń nie może spełniać wymagań LinkDemands, kod nie może również wywoływać metod oznaczonych atrybutem SuppressUnmanagedCodeSecurity lub metod klasy oznaczonej atrybutem SuppressUnmanagedCodeSecurity. Metoda zakończy się niepowodzeniem lub zapotrzebowanie zostanie przekonwertowane na pełne zapotrzebowanie.

Naruszenia tej reguły prowadzą do MethodAccessException modelu przejrzystości zabezpieczeń poziomu 2 i pełnego zapotrzebowania na UnmanagedCode model przejrzystości poziomu 1.

Jak naprawić naruszenia

Aby naprawić naruszenie tej reguły, usuń SuppressUnmanagedCodeSecurityAttribute atrybut i oznacz metodę za pomocą atrybutu SecurityCriticalAttributeSecuritySafeCriticalAttribute lub .

Kiedy pomijać ostrzeżenia

Nie pomijaj ostrzeżeń dla 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);
        }
    }

}