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