阻止.NET代码调用特定方法?

时间:2011-11-16 21:27:58

标签: .net compiler-errors fxcop

如果调用某个方法,有没有办法创建编译时错误?

作为一个例子,我想做的是阻止某个项目中的代码调用System.Configuration.ConfigurationManager.AppSettings()。有没有办法标记项目或类文件,以便在调用该方法时引发编译时错误?

我认为没有,所以我的想法是,唯一的方法就是生成一个FxCop规则来标记这些调用并按照这种方式执行,但我对其他想法持开放态度。

我使用的是.NET 3.5。不确定4.0代码合同是否可以做到这一点。

更新

我是专门讨论框架方法,而不是我自己的,所以我不能将它们标记为过时。

此时我并不关心反思。

另一个例子是System.Web.HttpUtility.HtmlEncode,我想找到并替换为Microsoft的AntiXss库,但我想在我的构建服务器上集成某种检查过程,以检查新代码。

2 个答案:

答案 0 :(得分:4)

你可以write your own rules in FxCop所以也许这是一个选择。

但是,在这种情况下,对于现有的代码库,您可能会发现编辑器中的“ConfigurationManager.AppSettings”中的Ctrl-F(查找)可能会以更少的工作量完成同样出色的工作......未来的执行虽然您可能会考虑向开发团队提供更人性化的电子邮件备忘录......

正如上面的评论者所强调并且值得注意的其他具有类似目标的人,如果这是指你自己的代码库中的一个函数(这个问题是指的话),您可以使用[Obsolete]属性。

答案 1 :(得分:2)

可以使用工具NDepend免责声明:我是该工具的开发人员之一)。

您可以编写一些Code Rules over LINQ Queries (CQLinq)来检查任何类型的依赖项,例如方法调用。每次成功编译后,代码规则可以是checked in Visual Studio,也可以是rules can be checked at build process time

这样的CQLinq代码规则可能如下所示:

warnif count > 0 
from m in Application.Methods         
where m.IsUsing("System.Configuration.ConfigurationManager.get_AppSettings()")
select m

规则可以随心所欲,禁止例如与正则表达式匹配的名称空间,以包含调用get_AppSettings() getter方法的方法:

warnif count > 0 
from m in Application.Namespaces.WithNameLike("regex").ChildMethods()
where m.IsUsing("System.Configuration.ConfigurationManager.get_AppSettings()")
select m

从NDepend dependency matrixdependency graph,您还可以右键单击依赖项(矩阵单元格或图形箭头)并生成代码规则,以警告依赖项是否存在(然后专门化生成的规则如果你需要):

enter image description here