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

Wim*_*nen 3 c# permissions fxcop

我在班级酒吧有一个房产Foo:

public int Foo
{
   get
   {
      return GetFoo();
   }
   set
   {
      SetFoo(value);
   }
}
Run Code Online (Sandbox Code Playgroud)

双方GetFooSetFoo都装饰有:

[SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
Run Code Online (Sandbox Code Playgroud)

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

CA2122:Microsoft.Security:'Bar.Foo.get()'调用具有LinkDemand的'Bar.GetFoo()'.通过进行此调用,'Bar.GetFoo()'间接暴露给用户代码.查看以下可能提供绕过安全保护的方法的调用堆栈:

但是,当我尝试将相同的SecurityPermission属性应用于属性以修复此警告时,事实证明属性不是此属性的有效目标.

如何正确修复此FxCop警告?


编辑:回应Eric Lippert的评论"为什么在地球上的LinkDemand"?

  1. 我使用Marshal.GetIUnknownForObject编写了一个函数,它具有用于非托管代码权限的LinkDemand.
  2. 我跑了FxCop,抱怨CA2122
  3. 我用谷歌搜索CA2122寻找有关错误意味着什么以及如何解决它的提示
  4. 在第一次谷歌热播中,我看到了Micheal Fanning建议使用LinkDemand解决错误

在阅读了你的反应之后,我很快就猜到了范宁的建议并不适用于我的情况.我现在看一下Demand vs. LinkDemand文章,并尝试使用Demand.

Eri*_*ger 6

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

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

   [SecurityPermission(...)]
   set
   {
      SetFoo(value);
   }
}
Run Code Online (Sandbox Code Playgroud)