次の方法で共有


CA2138: 透過的メソッドは、SuppressUnmanagedCodeSecurity 属性を持つメソッドを呼び出してはならない

TypeName

TransparentMethodsMustNotCallSuppressUnmanagedCodeSecurityMethods

CheckId

CA2138

カテゴリ

Microsoft.Security

互換性に影響する変更点

あり

原因

SuppressUnmanagedCodeSecurityAttribute 属性が適用されたメソッドを、透過的セキュリティ メソッドが呼び出します。

規則の説明

この規則は、P/Invoke (プラットフォーム呼び出し) 呼び出しを使用するなどの方法で、ネイティブ コードを直接呼び出す透過的メソッドに対して適用されます。 SuppressUnmanagedCodeSecurityAttribute 属性が設定された P/Invoke メソッドと COM 相互運用メソッドでは、呼び出し元のメソッドに対して LinkDemand が実行されます。 透過的セキュリティ コードは LinkDemands を満たすことができないため、SuppressUnmanagedCodeSecurity 属性が設定されたメソッドを呼び出すことも、SuppressUnmanagedCodeSecurity 属性が設定されたクラスのメソッドを呼び出すこともできません。 メソッドは失敗するか、要求がフル アクセス要求に変換されます。

この規則に違反すると、レベル 1 の透過的セキュリティ モデルでは 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);
        }
    }

}