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