Share via


CA2138: I metodi Transparent non devono chiamare i metodi con l'attributo SuppressUnmanagedCodeSecurity

Articolo Valore
ID regola CA2138
Category Microsoft.Security
Modifica Interruzione

Causa

Un metodo trasparente per la sicurezza chiama un metodo contrassegnato con l'attributo SuppressUnmanagedCodeSecurityAttribute .

Nota

Questa regola è stata deprecata. Per altre informazioni, vedere Regole deprecate.

Descrizione regola

Questa regola viene attivata su qualsiasi metodo trasparente che chiama direttamente nel codice nativo, ad esempio usando una chiamata P/Invoke (platform invoke). I metodi di interoperabilità P/Invoke e COM contrassegnati con l'attributo comportano l'esecuzione SuppressUnmanagedCodeSecurityAttribute di un LinkDemand sul metodo chiamante. Poiché il codice trasparente per la sicurezza non può soddisfare LinkDemands, il codice non può chiamare anche i metodi contrassegnati con l'attributo SuppressUnmanagedCodeSecurity o i metodi della classe contrassegnati con l'attributo SuppressUnmanagedCodeSecurity. Il metodo avrà esito negativo o la richiesta verrà convertita in una richiesta completa.

Le violazioni di questa regola comportano un MethodAccessException nel modello di trasparenza della sicurezza di livello 2 e una richiesta completa per UnmanagedCode nel modello di trasparenza di livello 1.

Come correggere le violazioni

Per correggere una violazione di questa regola, rimuovere l'attributo SuppressUnmanagedCodeSecurityAttribute e contrassegnare il metodo con l'attributo SecurityCriticalAttributeSecuritySafeCriticalAttribute o .

Quando eliminare gli avvisi

Non escludere un avviso da questa regola.

Esempio

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

}