次の方法で共有


CA2133: デリゲートは透過性の整合がとれたメソッドにバインドする必要がある

TypeName

DelegatesMustBindWithConsistentTransparency

CheckId

CA2133

カテゴリ

Microsoft.Security

互換性に影響する変更点

あり

注意

この警告は、CoreCLR (Silverlight Web アプリケーションに固有の CLR バージョン) を実行しているコードにのみ適用されます。

原因

この警告は、SecurityCriticalAttribute が設定されているデリゲートを、透過的なメソッドまたは SecuritySafeCriticalAttribute が設定されているメソッドにバインドするメソッドに対して適用されます。 この警告は、透過的なデリゲートまたはセーフ クリティカルなデリゲートを、クリティカル メソッドにバインドするメソッドに対しても適用されます。

規則の説明

デリゲート型、およびそのバインド先のメソッドの透過性は、一貫している必要があります。 透過的デリゲートおよびセーフ クリティカルなデリゲートは、その他の透過的メソッドまたはセーフ クリティカルなメソッドにのみバインドできます。 同様に、クリティカル デリゲートは、クリティカル メソッドにのみバインドできます。 これらのバインディング規則により、あるメソッドをデリゲート経由で呼び出すことができる唯一のコードは、同じメソッドを直接呼び出すことができるコードであるということが保証されます。 たとえば、バインディング規則により、透過的なコードが透過的デリゲートを経由してクリティカル コードを直接呼び出すことを防止できます。

違反の修正方法

この警告の違反を修正するには、デリゲートまたはそのバインド先のメソッドの透過性を変更して、両者の透過性を等しくする必要があります。

警告を抑制する状況

この規則による警告は抑制しないでください。

コード

using System;
using System.Security;

namespace TransparencyWarningsDemo
{

    public delegate void TransparentDelegate();

    [SecurityCritical]
    public delegate void CriticalDelegate();

    public class TransparentType
    {
        void DelegateBinder()
        {
            // CA2133 violation - binding a transparent delegate to a critical method
            TransparentDelegate td = new TransparentDelegate(CriticalTarget);

            // CA2133 violation - binding a critical delegate to a transparent method
            CriticalDelegate cd = new CriticalDelegate(TransparentTarget);
        }

        [SecurityCritical]
        void CriticalTarget() { }

        void TransparentTarget() { }
    }
}