Freigeben über


CA2133: Delegaten müssen an Methoden mit konsistenter Transparenz gebunden werden

TypeName

DelegatesMustBindWithConsistentTransparency

CheckId

CA2133

Kategorie

Microsoft.Security

Unterbrechende Änderung

Breaking

Tipp

Diese Warnung wird nur für Code übernommen, in dem die CoreCLR ausgeführt wird (die Version der CLR, die speziell für Silverlight-Webanwendungen verwendet wird).

Ursache

Diese Warnung wird für eine Methode ausgelöst, die einen Delegat, der mit dem SecurityCriticalAttribute-Objekt markiert ist, an eine Methode bindet, die transparent oder mit dem SecuritySafeCriticalAttribute-Objekt markiert ist. Die Warnung wird auch für eine Methode ausgelöst, die einen transparenten oder sicherheitsrelevanten Delegaten an eine wichtige Methode bindet.

Regelbeschreibung

Delegattypen und Methoden, die sie binden, um über konsistente Transparenz zu verfügen. Transparente und sicherheitsgeschützte Delegaten können nur an andere transparente oder sicherheitsgeschützte Methoden gebunden werden. Auf ähnliche Weise dürfen sich wichtige Delegaten nur an wichtige Methoden binden. Diese Bindungsregeln stellen sicher, dass im einzigen Code, in dem eine Methode über einen Delegaten aufgerufen werden kann, die gleiche Methode auch direkt hätte aufgerufen werden können. Bindungsregeln verhindern z. B., dass in transparentem Code wichtiger Code für einen transparenten Delegaten direkt aufgerufen wird.

Behandeln von Verstößen

Um eine Verletzung dieser Warnung zu korrigieren, ändern Sie die Transparenz des Delegaten oder der Methode, die gebunden wird, damit die Transparenz der zwei Objekte übereinstimmt.

Wann sollten Warnungen unterdrückt werden?

Unterdrücken Sie keine Warnung dieser Regel.

Code

using System;
using System.Security;

namespace TransparencyWarningsDemo
{

    public delegate void TransparentDelegate();

    [SecurityCritical]
    public delegate void CriticalDelegate();

    public class TransparentType
    {
        void DelegateBinder()
        {
            // CA2133 violation - binding a transparent delegate to a critical method
            TransparentDelegate td = new TransparentDelegate(CriticalTarget);

            // CA2133 violation - binding a critical delegate to a transparent method
            CriticalDelegate cd = new CriticalDelegate(TransparentTarget);
        }

        [SecurityCritical]
        void CriticalTarget() { }

        void TransparentTarget() { }
    }
}