【发布时间】:2010-04-14 13:49:50
【问题描述】:
是否可以隐藏特定的宪兵缺陷信息? 我想在源代码中使用标志或类似的东西来做到这一点。
【问题讨论】:
标签: code-analysis static-analysis static-code-analysis gendarme
是否可以隐藏特定的宪兵缺陷信息? 我想在源代码中使用标志或类似的东西来做到这一点。
【问题讨论】:
标签: code-analysis static-analysis static-code-analysis gendarme
正如 poupou 已经指出的,2.10 版支持 [SuppressMessage] 属性。
例如,要禁止使用 AvoidNonAlphanumericIdentifierRule 规则,请执行以下操作:
[SuppressMessage("Gendarme.Rules.Naming", "AvoidNonAlphanumericIdentifierRule")]
protected void Application_Start()
{
...
}
请注意,您需要指定规则所在的程序集的名称...在这种情况下,AvoidNonAlphanumericIdentifierRule 位于 Gendarme.Rules.Naming.dll 中。完整的规则列表及其程序集名称为 here。
【讨论】:
CODE_ANALYSIS符号定义for this to work。
如果您使用控制台运行程序,那么您可以使用缺陷文件(源外)来抑制方法、类型或程序集上的任何缺陷。
新的 Gendarme 2.8 对 [SuppressMessage] 属性(与 fxcop 相同)具有基本(读取不完整和错误)支持。预计 2.10 发布后此功能将正常工作。
【讨论】:
据我所知,没有办法在 Gendarme(2.8 版本)中启用 [SuppressMessage]。我从 GitHub 上获取了最新的源代码,因为它没有像描述的那样工作。
SupressMessageEngine 在代码中,并且有一些测试通过手动覆盖 Runner.Engines.Subscribe 来执行它。但是 [EngineDependency (typeof(SuppressMessageEngine))] 并未应用于所有已编译的规则,这是宪兵实际运行时订阅的方式。
我还查看了源代码,以找到一种始终通过配置订阅特定引擎的方法——但没有。
我可能是错的,但他们忘记返回并应用适当的 EngineDependency 属性似乎是一个疏忽。
我能想到的唯一“解决方法”是编写一个自定义规则,在调用该规则时,添加订阅 SuppressMessageEngine 并且不执行任何其他操作。哈克是的,但这应该根据我在他们的代码中看到的内容来工作。
仅供参考——刚刚实现了这个。您需要创建自己的自定义规则,导入 Mono.Cecil 和 Gendarme.Framework 并以 .NET framework 3.5 为目标
using Gendarme.Framework;
using Gendarme.Framework.Engines;
namespace MyRules
{
[Problem("Gendarme devs forgot to attribute rules with SuppressMessageEngine")]
[Solution("Include this rule")]
[EngineDependency(typeof(SuppressMessageEngine))]
public class AddSuppressMessageSupportRule : Rule {}
}
遗憾的是,这不会引入 那里的 FxCopCompatibility 属性(即,匹配宪兵规则的 FxCop 规则的 SupressMessage 也会抑制宪兵规则),但至少它允许你用宪兵的名字来压制。
【讨论】: