5

WCFサービスの承認を処理するためのカスタムCodeAccessSecurityAttributeを構築しています。私はそのようにクラスAを構築しました:

public class A : CodeAccessSecurityAttribute
{
    public A() : base(SecurityAction.Demand)
    {
        // Constructor Code
    }

    public override IPermission CreatePermission()
    {
        // Permission Creation Code
    }

}

また、コンパイル時にこのエラーが発生します。

Error emitting 'A' attribute -- 'Serialized security custom attribute is 
truncated or incorrectly formed.'

少し遊んだ後、エラーなしでコンパイルされる次のサンプルを思いつきました。

public class B : CodeAccessSecurityAttribute
{
    public B(SecurityAction Action) : base(Action)
    {
        // Constructor Code
    }

    public override IPermission CreatePermission()
    {
        // Permission Creation Code
    }

}

SecurityAction列挙型がクラスAのパブリック側を直接参照していないためですが、私が理解できないのは、クラスBではなくクラスAメソッドを実行できるようにする方法です。

4

2 に答える 2

11

要件の正確な理由はわかりませんが、CodeAccessSecurityAttributeのMSDNドキュメントには明確に記載されています

相続人へのメモ

このクラスから派生したすべての権限属性には、SecurityActionを唯一のパラメーターとして取る単一のコンストラクターのみが必要です。

修正:この要件の理由CodeAccessSecurityAttributeは、低レベルの観点から、他のカスタム属性とはまったく異なるためです。通常、カスタム属性は、CustomAttributeテーブルのコンパイル済みメタデータに格納されます。ただし、から派生したセキュリティ属性SecurityAttributeは、テーブルに個別に格納されDeclSecurityます。また、このテーブルにはCustomAttributeテーブルのような一般的なデータは含まれていません。このテーブルには、の値Action、属性タイプの名前、およびカスタム属性の場合のように一連のプロパティ(名前付き引数)が含まれています。したがって、コンパイラは一般的なカスタム属性構文をこのメタデータテーブルのエントリに変換する必要があるため、上記の固定形式に従う必要があります。(このブログ投稿、またはパーティションIIのセクションも参照してください。22.11 DeclSecurity:共通言語インフラストラクチャ(CLI)標準の0x0E。)

于 2011-02-14T18:32:47.213 に答える
3

コンストラクターにデフォルト値を指定する場合、属性で指定する必要はありません。

public class B : CodeAccessSecurityAttribute 
{ 
    public B(SecurityAction Action = SecurityAction.Demand) : base(Action) 
    { 
        // Constructor Code 
    } 

    public override IPermission CreatePermission() 
    { 
        // Permission Creation Code 
    } 
} 
于 2012-03-28T13:00:01.183 に答える