是否有任何技巧禁止在项目代码中添加对某些方法的调用?当然,组织方面的除外。特别是,我想删除使用所有System.Windows.Forms.MessageBox.Show()不包含参数的重载的能力IWin32Window owner:
Show(String)
Show(String, String)
Show(String, String, MessageBoxButtons)
Show(String, String, MessageBoxButtons, MessageBoxIcon)
Show(String, String, MessageBoxButtons, MessageBoxIcon, MessageBoxDefaultButton)
Show(String, String, MessageBoxButtons, MessageBoxIcon, MessageBoxDefaultButton, MessageBoxOptions)
Show(String, String, MessageBoxButtons, MessageBoxIcon, MessageBoxDefaultButton, MessageBoxOptions, Boolean)
Show(String, String, MessageBoxButtons, MessageBoxIcon, MessageBoxDefaultButton, MessageBoxOptions, String)
Show(String, String, MessageBoxButtons, MessageBoxIcon, MessageBoxDefaultButton, MessageBoxOptions, String, HelpNavigator)
Show(String, String, MessageBoxButtons, MessageBoxIcon, MessageBoxDefaultButton, MessageBoxOptions, String, HelpNavigator, Object)
Show(String, String, MessageBoxButtons, MessageBoxIcon, MessageBoxDefaultButton, MessageBoxOptions, String, String)
这里提到了 Roslyn API 解决方案,它也很容易制作。
首先,让我们创建一个解析器,如本答案所示。我们无法提出合理的代码修复,因此我们只会进行分析并用红色曲线突出显示。
我们的分析器代码如下:
我们得到这种行为:
如果您还想在构建期间检查代码(如果程序员禁用分析器或不使用 Visual Studio 怎么办?),您还需要编写一个命令行分析器,类似于此处描述的内容,并在何时运行它在构建服务器上构建(或在构建后步骤中)。
我得到了以下命令行分析器:
在 Post-Build 步骤中,只需指定
在我的测试运行中,我得到了:
标准号 但例如,resharper 具有外部注释,允许您向第三方代码添加属性,例如Obsolete 。
您可以为这些目的编写自己的程序,使用解析 MSIL 代码的现有最佳实践。让我们编写以下程序,将程序集的路径作为输入,如果它不包含对禁止方法的调用,则返回代码 0,如果有则返回代码 1(代码在性能方面效率低下,仅作为示例):
让我们编译它(最好在 Release 模式下,因为这个过程非常困难),并放置生成的文件,使其路径为
D:\Distr\AssValidator\AssValidator.exe.在项目属性中,在“构建事件”选项卡上,设置构建后的事件:
现在,当尝试使用禁止的方法构建项目时,我们得到一个构建错误
它看起来像这样:
针对 .NET 4.5 / VS 2012 进行了测试。
该方法的缺点:
程序集验证可以在其中执行代码(例如,静态构造函数)。特别是,这段代码可能会出现异常并破坏一切。
要为非AnyCPU项目工作,您将需要两个版本的检查程序(32 位和 64 位)
虽然如果检查失败则构建失败,但编译后的程序集文件本身仍然存在。同样,您可以创建一个 BAT 文件,以在检查失败时删除该程序集。