当属性getter / setter需要LinkDemand时,如何安抚FxCop?

时间:2009-10-06 16:55:16

标签: c# permissions fxcop

我在类Bar上有一个属性Foo:

public int Foo
{
   get
   {
      return GetFoo();
   }
   set
   {
      SetFoo(value);
   }
}

GetFooSetFoo都装饰着:

[SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]

结果,FxCop正确地抱怨Foo属性(或者它的隐式getter和setter方法)没有相同的LinkDemand:

  

CA2122:Microsoft.Security:   'Bar.Foo.get()'调用   'Bar.GetFoo()'有一个LinkDemand。   通过这个调用,'Bar.GetFoo()'是   间接暴露给用户代码。   查看以下调用堆栈   可能会揭露一种规避方式   安全保护:

但是,当我尝试将相同的SecurityPermission属性应用于该属性以修复此警告时,结果发现属性不是此属性的有效目标。

如何正确修复此FxCop警告?

<小时/> 编辑:回应Eric Lippert的评论“为什么在地球上的LinkDemand”?

  1. 我用了写了一个函数 Marshal.GetIUnknownForObject,其中 具有LinkDemand以获得非托管代码权限。
  2. 我跑了FxCop,抱怨CA2122
  3. 我用Google搜索CA2122寻找提示 关于错误意味着什么以及如何 解决它
  4. 在第一个first google hit我 看到了Micheal Fanning的使用建议 LinkDemand解决错误
  5. 在阅读了你的反应之后,我很快就猜到了Fanning的建议并不适用于我的情况。我现在看一下Demand vs. LinkDemand文章,并尝试使用Demand。

2 个答案:

答案 0 :(得分:6)

您应该能够直接将属性应用于getter和setter,即:

public int Foo
{
   [SecurityPermission(...)]
   get
   {
      return GetFoo();
   }

   [SecurityPermission(...)]
   set
   {
      SetFoo(value);
   }
}

答案 1 :(得分:0)

仅供参考,您可以使用

进行装饰

[PermissionSetAttribute(SecurityAction.LinkDemand,Name =“FullTrust”)]

参见页面: what does this security warning mean (.Net Process class)?