Freigeben über


CA2138: Transparente Methoden dürfen keine Methoden mit dem SuppressUnmanagedCodeSecurity-Attribut aufrufen

TypeName

TransparentMethodsMustNotCallSuppressUnmanagedCodeSecurityMethods

CheckId

CA2138

Kategorie (Category)

Microsoft.Security

Unterbrechende Änderung

Breaking

Ursache

Eine sicherheitstransparente Methode ruft eine Methode auf, die mit dem SuppressUnmanagedCodeSecurityAttribute-Attribut markiert ist.

Regelbeschreibung

Diese Regel wird für jede transparente Methode ausgelöst, die direkt einen Aufruf in systemeigenem Code ausführt, z. B. mit einem P/Invoke-Aufruf (Plattformaufruf).P/Invoke- und COM-Interop-Methoden, die mit dem SuppressUnmanagedCodeSecurityAttribute-Attribut markiert werden, führen zu einem LinkDemand, der für die aufrufende Methode durchgeführt wird.Da sicherheitstransparenter Code LinkDemands nicht zufrieden stellen kann, können im Code auch nicht Methoden, die mit dem SuppressUnmanagedCodeSecurity-Attribut markiert werden, oder Methoden einer Klasse, die mit SuppressUnmanagedCodeSecurity-Attribut markiert wird, aufgerufen werden.Die Methode schlägt fehl, oder die Forderung wird in eine vollständige Forderung konvertiert.

Verstöße gegen diese Regel führen im Sicherheitstransparenzmodell der Ebene 2 zu einer MethodAccessException, und eine vollständige Anforderung für UnmanagedCode im Transparenzmodell der Ebene 1.

Behandeln von Verstößen

Um eine Verletzung dieser Regel zu korrigieren, entfernen Sie das SuppressUnmanagedCodeSecurityAttribute-Attribut, und markieren Sie die Methode mit dem SecurityCriticalAttribute-Attribut oder dem SecuritySafeCriticalAttribute-Attribut.

Wann sollten Warnungen unterdrückt werden?

Unterdrücken Sie keine Warnung dieser Regel.

Beispiel

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

}