我正在构建一个自定义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类
答案 0 :(得分:11)
我不知道要求的确切原因,但MSDN documentation on CodeAccessSecurityAttribute明确说明
对继承者的说明
从此类派生的所有权限属性必须只有一个构造函数,该构造函数将SecurityAction作为其唯一参数。
已修订:此要求的原因是CodeAccessSecurityAttribute
从低级别视图与其他自定义属性完全不同。通常,自定义属性存储在CustomAttribute
表中的已编译元数据中。但是,源自SecurityAttribute
的安全属性将单独存储在DeclSecurity
表中。此表不包含CustomAttribute表之类的常规数据,此表包含Action
的值,属性类型的名称,以及自定义属性案例中的一组属性(命名参数)。因此,编译器需要将常规自定义属性语法转换为此元数据表中的条目,因此需要它遵循上面提到的固定形式。 (另请参阅{em>公共语言基础结构(CLI)标准的this blog post或Partition II, 22.11 DeclSecurity:0x0E 部分。)
答案 1 :(得分:3)
如果为构造函数提供默认值,则不必在属性中指定它。
public class B : CodeAccessSecurityAttribute
{
public B(SecurityAction Action = SecurityAction.Demand) : base(Action)
{
// Constructor Code
}
public override IPermission CreatePermission()
{
// Permission Creation Code
}
}