5

我正在构建一个自定义 CodeAccessSecurityAttribute 来处理我的 WCF 服务的授权。我这样构建了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 类的公共方面,但我不知道如何制作它,以便我可以使用 A 类方法而不是 B 类方法。

4

2 回答 2

11

我不知道要求的确切原因,但CodeAccessSecurityAttribute 上的 MSDN 文档明确指出

继承人须知

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

修正:这个要求的原因CodeAccessSecurityAttribute是,从底层的角度来看,与其他自定义属性有很大的不同。通常,自定义属性存储在CustomAttribute表中已编译的元数据中。但源自 的安全属性SecurityAttribute分别存储在DeclSecurity表中。并且该表不包含像 CustomAttribute 表那样的一般数据,该表包含 的值Action、属性类型的名称,以及自定义属性案例中的一组属性(命名参数)。因此,编译器需要将通用的自定义属性语法转换为此元数据表中的条目,因此它需要遵循上述固定形式。(另请参阅此博客文章或第二部分,部分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 回答