CA2140:透明代码不得引用安全关键项

类型名

TransparentMethodsMustNotReferenceCriticalCode

CheckId

CA2140

类别

Microsoft.Security

是否重大更改

原因

透明方法:

  • 处理安全关键安全异常类型

  • 拥有标记为安全关键类型的参数

  • 拥有带安全关键约束的参数

  • 拥有安全关键类型的局部变量

  • 引用标记为关键安全类型或成员的类型

  • 调用标记为“安全关键”的方法

  • 引用标记为关键安全类型或成员的字段

  • 返回标记为关键安全类型或成员的类型

规则说明

SecurityCriticalAttribute 特性标记的代码都是安全关键代码。 透明方法不能使用安全关键元素。 如果透明类型尝试使用安全关键类型,则会引发 TypeAccessException, MethodAccessExceptionFieldAccessException

如何解决冲突

要解决此规则的冲突,进行以下操作之一:

何时禁止显示警告

不要禁止显示此规则发出的警告。

示例

在下面的示例中,透明的方法尝试引用安全关键泛型集合、安全关键字段和安全的关键方法。

using System;
using System.Security;
using System.Collections.Generic;

namespace TransparencyWarningsDemo
{

    [SecurityCritical]
    public class SecurityCriticalClass { }

    public class TransparentMethodsReferenceCriticalCodeClass
    {
        [SecurityCritical]
        private object m_criticalField;

        [SecurityCritical]
        private void CriticalMethod() { }

        public void TransparentMethod()
        {
            // CA2140 violation - transparent method accessing a critical type.  This can be fixed by any of:
            //  1. Make TransparentMethod critical
            //  2. Make TransparentMethod safe critical
            //  3. Make CriticalClass safe critical
            //  4. Make CriticalClass transparent
            List<SecurityCriticalClass> l = new List<SecurityCriticalClass>();

            // CA2140 violation - transparent method accessing a critical field.  This can be fixed by any of:
            //  1. Make TransparentMethod critical
            //  2. Make TransparentMethod safe critical
            //  3. Make m_criticalField safe critical
            //  4. Make m_criticalField transparent
            m_criticalField = l;

            // CA2140 violation - transparent method accessing a critical method.  This can be fixed by any of:
            //  1. Make TransparentMethod critical
            //  2. Make TransparentMethod safe critical
            //  3. Make CriticalMethod safe critical
            //  4. Make CriticalMethod transparent
            CriticalMethod();
        }
    }
}

请参见

参考

SecurityTransparentAttribute

SecurityCriticalAttribute

SecurityTransparentAttribute

SecurityTreatAsSafeAttribute

System.Security