有没有办法在自定义 System.Security.IPermission 实现上修复此 FxCop CA2103 警告?
Posted
技术标签:
【中文标题】有没有办法在自定义 System.Security.IPermission 实现上修复此 FxCop CA2103 警告?【英文标题】:Is there a way to fix this FxCop CA2103 warning on a custom System.Security.IPermission implementaion? 【发布时间】:2012-01-23 18:51:45 【问题描述】:我有一个实现IPermission
的类:
public class MySecurityPermission : IPermission
private string[] _demandRoles;
private string[] _denyRoles;
public MySecurityPermission(string[] demandRoles, string[] denyRoles)
this._demandRoles = demandRoles;
this._denyRoles = denyRoles;
现在,IPermission 接口需要一个Copy()
方法,我将其实现为:
public IPermission Copy()
return new MySecurityPermission(this._demandRoles.ToArray(), this._denyRoles.ToArray());
请注意,.ToArray()
调用在那里是因为它会关闭/复制数组,并返回一个新的数组实例,而不是传递相同的数组。
这会产生 FxCop CA2103:
“查看以下内容以了解可能的安全漏洞: 在 'MySecurityPermission.Copy()' 中,返回值 调用 'Enumerable.ToArray(this IEnumerable)' 正在传递给 'MySecurityPermission' 构造函数。”
有没有办法“解决”这个问题?我不确定为什么 FxCop 甚至会抱怨它。如果有人能解释一下,那就太好了。
【问题讨论】:
如果您将字段标记为readonly
,会发生什么?
为您的阅读乐趣提供更多信息(不确定是否有帮助):msdn.microsoft.com/en-us/library/ms182309(v=vs.100).aspx
@vcsjones - 这也是我最初的反应,但该接口还需要一个 FromXML()
方法,我需要在这些数组中基于 XML 设置值,因此它们不能是只读的:(
【参考方案1】:
似乎由于代码的执行位置而引发了规则。如果您先创建变量,则规则将通过:
public IPermission Copy()
var demand = _demandRoles.ToArray();
var deny = _denyRoles.ToArray();
return new MySecurityPermission(demand, deny);
【讨论】:
啊,好电话。我开始尝试自己修复它,方法是手动将Array.Copy()
放入一个新变量中,然后将其传递给构造函数。这似乎也有效,但您的解决方案更容易。我很惊讶 FxCop 看到了不同。我本来希望 IL 代码大致相同。谢谢!以上是关于有没有办法在自定义 System.Security.IPermission 实现上修复此 FxCop CA2103 警告?的主要内容,如果未能解决你的问题,请参考以下文章
调用微信退款接口时,证书验证出现System.Security.Cryptography.CryptographicException: 出现了内部错误 解决办法
调用微信退款接口时出现System.Security.Cryptography.CryptographicException: 出现了内部错误 解决办法