Udostępnij za pośrednictwem


CA2132: Konstruktory domyślne muszą być co najmniej tak krytyczne, jak podstawowe konstruktory domyślne

Pozycja Wartość
Ruleid CA2132
Kategoria Microsoft.Security
Zmiana powodująca niezgodność Kluczowa

Uwaga

To ostrzeżenie jest stosowane tylko do kodu z uruchomioną biblioteką CoreCLR (wersja środowiska CLR specyficzna dla aplikacji internetowych silverlight).

Przyczyna

Atrybut przezroczystości domyślnego konstruktora klasy pochodnej nie jest tak krytyczny, jak przezroczystość klasy bazowej.

Uwaga

Ta reguła została przestarzała. Aby uzyskać więcej informacji, zobacz Przestarzałe reguły.

Opis reguły

Typy i elementy członkowskie, których SecurityCriticalAttribute nie można używać w kodzie aplikacji Silverlight. Krytyczne dla bezpieczeństwa typy i składowe mogą być używane tylko przez zaufany kod w środowisku .NET Framework dla biblioteki klas Silverlight. Ze względu na to, że publiczna lub chroniona konstrukcja w klasie pochodnej musi mieć taką samą lub większą przejrzystość jak jej klasa bazowa, klasy w aplikacji nie mogą pochodzić z klasy oznaczonej jako SecurityCritical.

W przypadku kodu platformy CoreCLR, jeśli typ podstawowy ma publiczny lub chroniony bez przezroczystego konstruktora domyślnego, typ pochodny musi przestrzegać domyślnych reguł dziedziczenia konstruktora. Typ pochodny musi również mieć konstruktor domyślny, a konstruktor musi być co najmniej krytycznym konstruktorem domyślnym typu podstawowego.

Jak naprawić naruszenia

Aby naprawić naruszenie, usuń typ lub nie pochodzi z zabezpieczeń, które nie są przezroczyste.

Kiedy pomijać ostrzeżenia

Nie pomijaj ostrzeżeń z tej reguły. Naruszenia tej reguły według kodu aplikacji spowodują odmowę załadowania typu za pomocą TypeLoadExceptionklasy CoreCLR.

Kod

using System;
using System.Security;

namespace TransparencyWarningsDemo
{

    public class BaseWithSafeCriticalDefaultCtor
    {
        [SecuritySafeCritical]
        public BaseWithSafeCriticalDefaultCtor() { }
    }

    public class DerivedWithNoDefaultCtor : BaseWithSafeCriticalDefaultCtor
    {
        // CA2132 violation - since the base has a public or protected non-transparent default .ctor, the
        // derived type must also have a default .ctor
    }

    public class DerivedWithTransparentDefaultCtor : BaseWithSafeCriticalDefaultCtor
    {
        // CA2132 violation - since the base has a safe critical default .ctor, the derived type must have
        // either a safe critical or critical default .ctor.  This is fixed by making this .ctor safe critical
        // (however, user code cannot be safe critical, so this fix is platform code only).
        DerivedWithTransparentDefaultCtor() { }
    }

    public class BaseWithCriticalCtor
    {
        [SecurityCritical]
        public BaseWithCriticalCtor() { }
    }

    public class DerivedWithSafeCriticalDefaultCtor : BaseWithSafeCriticalDefaultCtor
    {
        // CA2132 violation - since the base has a critical default .ctor, the derived must also have a critical
        // default .ctor.  This is fixed by making this .ctor critical, which is not available to user code
        [SecuritySafeCritical]
        public DerivedWithSafeCriticalDefaultCtor() { }
    }
}