CA2138:透明方法不得调用具有 SuppressUnmanagedCodeSecurity 特性的方法
类型名 |
TransparentMethodsMustNotCallSuppressUnmanagedCodeSecurityMethods |
CheckId |
CA2138 |
类别 |
Microsoft.Security |
是否重大更改 |
是 |
原因
安全透明方法调用用 SuppressUnmanagedCodeSecurityAttribute 特性标记的方法。
规则说明
此规则触发任何透明的方法,其直接调用到本机代码中,例如通过使用 P/invoke(平台调用)调用。 标记为 SuppressUnmanagedCodeSecurityAttribute 特性的 P/invoke 和 COM 互操作方法将在调用方法中触发 LinkDemand。 因为安全透明代码不能满足 LinkDemands,该代码也不能调用用 SuppressUnmanagedCodeSecurity 特性标记的方法,或调用用 SuppressUnmanagedCodeSecurity 特性标记的方法或类。 该方法将失败,或该要求将被转换为完整的请求。
违反该规则会导致级别 2 安全透明模型中的 MethodAccessException,以及级别 1 透明度模型中的 UnmanagedCode 的完全要求。
如何解决冲突
要解决此规则的冲突,删除 SuppressUnmanagedCodeSecurityAttribute 特性,或使用 SecurityCriticalAttribute 或 SecuritySafeCriticalAttribute 特性标记方法。
何时禁止显示警告
不要禁止显示此规则发出的警告。
示例
using System;
using System.Runtime.InteropServices;
using System.Security;
namespace TransparencyWarningsDemo
{
public class CallSuppressUnmanagedCodeSecurityClass
{
[SuppressUnmanagedCodeSecurity]
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool Beep(uint dwFreq, uint dwDuration);
public void CallNativeMethod()
{
// CA2138 violation - transparent method calling a method marked with SuppressUnmanagedCodeSecurity
// (this is also a CA2149 violation as well, since this is a P/Invoke and not an interface call).
Beep(10000, 1);
}
}
}