Udostępnij za pośrednictwem


CA2133: Delegatów należy powiązać z metodami ze spójną jawnością

TypeName

DelegatesMustBindWithConsistentTransparency

CheckId

CA2133

Kategoria

Microsoft.Security

Złamanie zmiany

Złamanie

[!UWAGA]

Ostrzeżenie to jest stosowane tylko do kodu, który działa CoreCLR (wersja środowiska CLR specyficzne dla aplikacji sieci Web dodatku Silverlight).

Przyczyna

To ostrzeżenie, pożary na metody, która wiąże pełnomocnik oznaczone SecurityCriticalAttribute do metody przezroczyste lub że oznaczone SecuritySafeCriticalAttribute.Ostrzeżenie pożary również metoda, która wiąże pełnomocnika, który jest przezroczysty lub bezpieczne krytycznych metody krytycznych.

Opis reguły

Typów delegatów i metod, które wiążą się z muszą mieć zgodne przezroczystości.Przejrzyste i bezpiecznego krytycznych delegatów tylko może zostać powiązany z innych metod przezroczyste lub bezpieczne krytycznych.Podobnie krytycznych delegatów tylko może powiązać metody krytycznych.Zasady te powiązania upewnij się, że tylko kod, który można wywołać metody za pośrednictwem pełnomocnik może mieć również wywołać tej samej metody bezpośrednio.Na przykład zasady wiążące zapobiec wywołanie kodu krytycznych bezpośrednio poprzez przejrzysty delegata przejrzysty kod.

Jak naprawić naruszenia

Aby usunąć naruszenie tego ostrzeżenia, należy zmienić przejrzystości pełnomocnika lub metody, która wiąże go tak, że przejrzystość dwóch są równoważne.

Kiedy do pomijania ostrzeżenia

Nie pomijaj ostrzeżenie od tej reguły.

Kod

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() { }
    }
}