我正在寻找一种方法来检测大型 Visual Studio 解决方案中程序集引用的问题:
- 对错误位置的二进制引用,例如不在源代码管理或另一个项目的输出中的路径
- 对解决方案中跨项目的同一程序集的多个版本的二进制引用
- 没有路径的二进制引用,可能会被重定向到 GAC
- 本应是项目引用的二进制引用
整个故事
我从事一个包含近 200 个项目的大型 C# 项目。 随着时间的推移逐渐出现的问题之一是添加了对程序集的引用,但并不总是指向相同的版本或正确的位置。
例如,一个项目可能会在没有提示路径的情况下获得对 System.Web.Mvc 的引用,使其引用 GAC 中的任何版本。 Visual Studio(和 Resharper)也将提供添加缺失引用的功能,但可以通过添加对另一个项目的输出文件夹的引用来实现。
现在最近Windows Update catastrophy让一些团队成员死在水中,无法构建解决方案。可以想象,这提高了我们的程序集引用管理的优先级。
为了检测一些最明显的问题,我已经设置了一个 msbuild 文件,该文件可以包含在每个 csproj 文件中,并将检测错误的引用。
但是,需要手动编辑新的项目文件以包含该脚本。所以这将不可避免地被遗忘。
我真正想要的是在持续构建期间检查解决方案中的所有项目文件是否存在“错误”引用,以便始终检查所有项目。
一段时间以来,我一直在 google 上寻找这样的解决方案,发现有很多静态分析和代码分析工具,但没有任何东西可以分析解决方案中的项目文件。
所以,在我离开之前 roll my own解决方案,有没有办法做到这一点?
更新
为了清理代码库,我创建了一些 ScriptCS 代码,这些代码将扫描所有 csproj 文件以查找对 Nuget 包中程序集的引用并修复它们。起来了on GitHub .
最佳答案
您可以创建一个 NuGet 包,其唯一目的是将自定义 .targets 文件合并到项目中。我最近使用此策略解决了另一个问题(缺少 .snk 文件的错误消息)。
如果您创建了一个类似的包,可以很容易地右键单击您的解决方案节点并验证它是否已安装在您的所有 C# 项目中。
如果您的分析更复杂并且除了.targets 文件之外还需要使用程序集(自定义构建任务),您可以使用我用于Antlr4 的方法。 NuGet 包,其中包含构建任务、资源和自定义 .props 和 .targets 文件,但没有安装它的项目引用的实际程序集。
- ANTLR 4 C# Target source code (包括 Antlr4 包源和构建脚本)
关于c# - 检查解决方案中的二进制引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26413605/