【问题标题】:Prevent .NET code from calling particular methods?防止 .NET 代码调用特定方法?
【发布时间】:2011-11-16 21:27:57
【问题描述】:

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

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

我不认为有,所以我认为唯一的方法是生成一个 FxCop 规则来标记这些调用并这样做,但我对其他想法持开放态度。

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

更新

我说的是框架方法,不是我自己的,所以我不能将它们标记为过时。

此时我并不关心反射。

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

【问题讨论】:

  • 是否也不允许通过反射调用此方法?
  • 如果它是您自己的程序集并且您可以重新编译,您可以使用 Obsolete 属性,如果这有帮助的话。
  • 如果您不希望他们使用它,为什么要开始?
  • @AustinSalonen,看来这是关于框架方法的。
  • @svick:给定 that 框架方法,您必须添加一个特定的引用,这样问题才成立。

标签: .net compiler-errors fxcop


【解决方案1】:

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

但是,在这种情况下,对于现有的代码库,您可能会发现“ConfigurationManager.AppSettings”编辑器中的 Ctrl-F(查找)可能会以更少的努力完成同样出色的工作......关于尽管您可能会考虑采用更人性化的方式将电子邮件备忘录发送给开发团队...

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

【讨论】:

  • 虽然我同意电子邮件应该有效,但我希望在验证方面更具体一些。
  • 也许告诉团队他们欠团队其他成员 6 包啤酒,因为他们违反了编码标准!?严肃地说,带有自定义规则的 FxCop 将帮助您对其进行验证,但前提是开发人员(或构建服务器)安装规则并正确使用 FxCop...
【解决方案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,您还可以右键单击依赖项(矩阵单元格或图形箭头)并生成一个代码规则,如果依赖项存在则发出警告(然后根据需要专门生成规则) :

【讨论】:

  • 我只使用过 NDepend UI。我必须检查是否可以将它集成到我们的 CruiseControl.NET/NAnt 构建脚本中。这可能吗?
  • 是的,这是可能的,请阅读我们的 CC.NET 集成相关文档:ndepend.com/Doc_CI_CCNet.aspx
猜你喜欢
  • 1970-01-01
  • 2011-07-26
  • 2018-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-14
  • 2017-06-07
  • 1970-01-01
相关资源
最近更新 更多