| 类型名 | TransparentMethodsMustNotReferenceCriticalCode | 
| CheckId | CA2140 | 
| 类别 | Microsoft.Security | 
| 是否重大更改 | 是 | 
原因
透明方法:
- 处理安全关键安全异常类型 
- 拥有标记为安全关键类型的参数 
- 拥有带安全关键约束的参数 
- 拥有安全关键类型的局部变量 
- 引用标记为关键安全类型或成员的类型 
- 调用标记为“安全关键”的方法 
- 引用标记为关键安全类型或成员的字段 
- 返回标记为关键安全类型或成员的类型 
规则说明
用 SecurityCriticalAttribute 特性标记的代码都是安全关键代码。透明方法不能使用安全关键元素。如果透明类型尝试使用安全关键类型,则会引发 TypeAccessException, MethodAccessException 或 FieldAccessException。
如何解决冲突
要解决此规则的冲突,进行以下操作之一:
- 用 SecurityCriticalAttribute 特性标记的安全关键代码标记代码元素。 - - 或 - 
- 从标记为关键安全类型或成员的代码元素中删除 SecurityCriticalAttribute 特性,并使用 SecuritySafeCriticalAttribute 或 SecurityTransparentAttribute 特性标记它们。 
何时禁止显示警告
不要禁止显示此规则发出的警告。
示例
在下面的示例中,透明的方法尝试引用安全关键泛型集合、安全关键字段和安全的关键方法。
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();
        }
    }
}