创建自定义CodeAccessSecurityAttribute会导致编译时出现异常

tha*_*awg 5 .net wcf code-security

我正在构建一个自定义CodeAccessSecurityAttribute来处理我的WCF服务的授权.我这样建了A级:

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

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

}
Run Code Online (Sandbox Code Playgroud)

在编译时会产生此错误.

Error emitting 'A' attribute -- 'Serialized security custom attribute is 
truncated or incorrectly formed.'
Run Code Online (Sandbox Code Playgroud)

在玩了一点之后我想出了下一个编译而没有错误的示例:

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

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

}
Run Code Online (Sandbox Code Playgroud)

我知道这是因为SecurityAction枚举没有直接引用到A类的公共端,但我无法弄清楚的是如何制作它以便我可以使用A类方法而不是B类.

Mor*_*gil 11

我不知道该要求的确切原因,但CodeAccessSecurityAttribute上MSDN文档清楚地说明了这一点

对继承者的说明

从此类派生的所有权限属性必须只有一个构造函数,该构造函数将SecurityAction作为其唯一参数.

修订:此要求的原因CodeAccessSecurityAttribute是,从低级别视图来看,与其他自定义属性完全不同.通常,自定义属性存储在CustomAttribute表中的已编译元数据中.但是,源自的安全属性SecurityAttribute分别存储在DeclSecurity表中.并且此表不包含CustomAttribute表之类的常规数据,此表包含值Action,属性类型的名称,以及自定义属性大小写中的一组属性(命名参数).因此,编译器需要将常规自定义属性语法转换为此元数据表中的条目,因此需要它遵循上面提到的固定形式.(另见本博客文章,或分区Ⅱ,部分22.11 DeclSecurity:为0x0E的的通用语言基础结构(CLI) .标准)