CA2138:透明方法不得调用具有 SuppressUnmanagedCodeSecurity 特性的方法

类型名

TransparentMethodsMustNotCallSuppressUnmanagedCodeSecurityMethods

CheckId

CA2138

类别

Microsoft.Security

是否重大更改

原因

安全透明方法调用用 SuppressUnmanagedCodeSecurityAttribute 特性标记的方法。

规则说明

此规则触发任何透明的方法,其直接调用到本机代码中,例如通过使用 P/invoke(平台调用)调用。 标记为 SuppressUnmanagedCodeSecurityAttribute 特性的 P/invoke 和 COM 互操作方法将在调用方法中触发 LinkDemand。 因为安全透明代码不能满足 LinkDemands,该代码也不能调用用 SuppressUnmanagedCodeSecurity 特性标记的方法,或调用用 SuppressUnmanagedCodeSecurity 特性标记的方法或类。 该方法将失败,或该要求将被转换为完整的请求。

违反该规则会导致级别 2 安全透明模型中的 MethodAccessException,以及级别 1 透明度模型中的 UnmanagedCode 的完全要求。

如何解决冲突

要解决此规则的冲突,删除 SuppressUnmanagedCodeSecurityAttribute 特性,或使用 SecurityCriticalAttributeSecuritySafeCriticalAttribute 特性标记方法。

何时禁止显示警告

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

示例

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);
        }
    }

}