CA2134: Metody musejí při přepisování základních metod zachovávat konzistentní transparentnost
TypeName |
MethodsMustOverrideWithConsistentTransparency |
CheckId |
CA2134 |
Kategorie |
Microsoft.Security |
Narušující změna |
Narušující |
Příčina
Toto pravidlo je spuštěno ve chvíli, kdy metoda označena značkou SecurityCriticalAttribute přepisuje průhlednou metodu nebo metodu označenou značkou SecuritySafeCriticalAttribute.Toto pravidlo je také spuštěno, pokud průhledná metoda nebo metoda označená značkou SecuritySafeCriticalAttribute přepisuje metodu označenou značkou SecurityCriticalAttribute.
Pravidlo je použito při přepisování virtuální metody nebo implementaci rozhraní.
Popis pravidla
Toto pravidlo je spuštěno při pokusu změnit bezpečností přístupnost metody výše v řetězci dědičnosti.Je-li například virtuální metoda v základní třídě průhledná nebo bezpečně kritická, musí ji odvozená třída přepsat průhlednou nebo bezpečně kritickou metodou.Pokud jen naopak virtuální metoda bezpečnostně kritická, musí ji odvozená třída přepsat bezpečnostně kritickou metodou.Stejné pravidlo platí pro implementaci metod rozhraní.
Pravidla průhlednosti jsou vynucována, je-li kód kompilován kompilátorem JIT namísto v modulu runtime, aby výpočet průhlednosti neobsahoval informace dynamického typu.Proto musí být výsledek výpočtu průhlednosti určitelný výhradně ze statických typů, které jsou kompilovány kompilátorem JIT, bez ohledu na dynamický typ.
Jak vyřešit porušení
Chcete-li opravit porušení tohoto pravidla, změňte průhlednost metody přepisující virtuální metody nebo implementující rozhraní tak, aby se shodovala s průhledností virtuální metody nebo metody rozhraní.
Kdy potlačit upozornění
Upozornění tohoto pravidla nepotlačujte.Porušení tohoto pravidla vyvolají v sestaveních používajících průhlednost úrovně 2 za běhu výjimku TypeLoadException.
Příklady
Kód
using System;
using System.Security;
namespace TransparencyWarningsDemo
{
public interface IInterface
{
void TransparentInterfaceMethod();
[SecurityCritical]
void CriticalInterfaceMethod();
}
public class Base
{
public virtual void TransparentVirtual() { }
[SecurityCritical]
public virtual void CriticalVirtual() { }
}
public class Derived : Base, IInterface
{
// CA2134 violation - implementing a transparent method with a critical one. This can be fixed by any of:
// 1. Making IInterface.TransparentInterfaceMethod security critical
// 2. Making Derived.TransparentInterfaceMethod transparent
// 3. Making Derived.TransparentInterfaceMethod safe critical
[SecurityCritical]
public void TransparentInterfaceMethod() { }
// CA2134 violation - implementing a critical method with a transparent one. This can be fixed by any of:
// 1. Making IInterface.CriticalInterfaceMethod transparent
// 2. Making IInterface.CriticalInterfaceMethod safe critical
// 3. Making Derived.TransparentInterfaceMethod critical
public void CriticalInterfaceMethod() { }
// CA2134 violation - overriding a transparent method with a critical one. This can be fixed by any of:
// 1. Making Base.TrasnparentVirtual critical
// 2. Making Derived.TransparentVirtual transparent
// 3. Making Derived.TransparentVirtual safe critical
[SecurityCritical]
public override void TransparentVirtual() { }
// CA2134 violation - overriding a critical method with a transparent one. This can be fixed by any of:
// 1. Making Base.CriticalVirtual transparent
// 2. Making Base.CriticalVirtual safe critical
// 3. Making Derived.CriticalVirtual critical
public override void CriticalVirtual() { }
}
}