CA2140:透明代码不得引用安全关键项
类型名 |
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();
}
}
}