CA2146:类型必须至少与其基类型和接口一样关键

类型名

TypesMustBeAtLeastAsCriticalAsBaseTypes

CheckId

CA2146

类别

Microsoft.Security

是否重大更改

原因

透明类型派生自用 SecuritySafeCriticalAttributeSecurityCriticalAttribute 标记的类型,或者说用 SecuritySafeCriticalAttribute 特性标记的类型派生自用 SecurityCriticalAttribute 标记的特性。

规则说明

当派生类型具有的安全透明特性与其基类型或实现的接口不是同样关键时,将引发此规则。 只有关键类型可以从关键基类型派生或实现关键接口,并且只有关键或关键安全类型可以从安全关键基类型派生或实现关键安全接口。 在级别 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.  The fix is any of:
    //   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
    {
    }

}