是否可以抑制特定的宪兵缺陷信息? 我想在源代码中用标志或类似的东西来做这件事。
答案 0 :(得分:5)
正如poupou已经注意到的,版本2.10支持[SuppressMessage]属性。
例如,要禁止使用AvoidNonAlphanumericIdentifierRule规则,请执行以下操作:
[SuppressMessage("Gendarme.Rules.Naming", "AvoidNonAlphanumericIdentifierRule")]
protected void Application_Start()
{
...
}
请注意,您需要指定规则所在的程序集的名称...在这种情况下,AvoidNonAlphanumericIdentifierRule位于Gendarme.Rules.Naming.dll中。完整的规则列表及其程序集名称为here。
答案 1 :(得分:1)
如果使用控制台运行程序,则可以使用缺陷文件(源代码外)来抑制方法,类型或程序集的任何缺陷。
新的Gendarme 2.8对[SuppressMessage]属性的基本(读取不完整和错误)支持(与fxcop相同)。 2.10发布后,预计此功能将正常工作。
答案 2 :(得分:0)
据我所知,Gendarme中没有办法启用 [SuppressMessage](2.8)。我抓住了GitHub的最新资源,因为它没有按照描述工作。
SupressMessageEngine在代码中,并且有测试通过手动覆盖Runner.Engines.Subscribe来执行它。但是[EngineDependency(typeof(SuppressMessageEngine))]并不适用于所有已编译的规则,这是Gendarme实际运行时订阅的方式。
我也查看了源代码,找到了一种始终通过config订阅特定引擎的方法 - 但是没有。
我可能是错的,但看起来他们忘了回去并应用适当的EngineDependency属性。
我能想到的唯一“解决方法”是编写一个自定义规则,在调用时添加订阅SuppressMessageEngine并且不执行任何其他操作。 Hacky是的,但是这个应该根据我在代码中看到的内容工作。
仅供参考 - 刚刚实施了这个。您需要创建自己的自定义规则,导入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属性(即,与Gendarme规则匹配的FxCop规则的SupressMessage也会抑制Gendarme规则),但至少它让你使用宪兵名称来压制。