CS.SV.CRITICAL_LVL

型は、ベース型やインターフェイスと同じくらいクリティカルでなければなりません。

この規則は、派生した型に、そのベース型または実装されたインターフェイスほどクリティカルではない、セキュリティ透過性属性がある場合に発動します。クリティカルなベース型から派生したり、クリティカルなインターフェイスを実装できるのは、クリティカルな型のみです。また、セーフクリティカルなベース型から派生したり、セーフクリティカルなインターフェイスを実装できるのは、クリティカルな型またはセーフクリティカルな型のみです。レベル 2 の透過性でこの規則に違反すると、派生した型に TypeLoadException が発生します。

軽減と防止

この違反を修正するには、派生した型または実装している型を、少なくともベース型またはインターフェイスと同じくらいクリティカルな透過性属性でマークします。

コピー
  using System;
  using System.Security;
  
  namespace TransparencyWarningsDemo
  {
  
      [SecuritySafeCritical]
      public class SafeCriticalBase
     {
     }
 
     // CA2156 violation - a transparent type cannot derive from a safe critical type.  修正は次のいずれかです。 
     //   1.Make SafeCriticalBase transparent 
     //   2.Make TransparentFromSafeCritical safe critical 
     //   3.Make TransparentFromSafeCritical critical 
     public class TransparentFromSafeCritical : SafeCriticalBase
     {
     }
 
     [SecurityCritical]
     public class CriticalBase
     {
     }
 
     // CA2156 violation - a transparent type cannot derive from a critical type.  The fix is any of:  
     //   1.Make CriticalBase transparent 
     //   2.Make TransparentFromCritical critical 
     public class TransparentFromCritical : CriticalBase
     {
     }
 
     // CA2156 violation - a safe critical type cannot derive from a critical type.  The fix is any of:  
     //   1.Make CriticalBase transparent 
     //   2.Make CriticalBase safe critical 
     //   3.Make SafeCriticalFromCritical critical
     [SecuritySafeCritical]
     public class SafeCriticalFromCritical : CriticalBase
     {
     }
 
 }