如何在Visual Studio 2017 Enterprise中查找未使用的WinForms窗体?
如何在VS2017 Enterprise中查找WinForms应用的未引用窗体
嘿,清理大型WinForms项目里的冗余窗体确实是个麻烦事——一个个查引用效率太低了,我来给你梳理下可行的方案,以及为什么Code Analyzer不够用:
首先,Code Analyzer确实不够全面
VS自带的Code Analyzer主要针对静态代码引用做分析,但WinForms项目里有很多静态工具抓不到的场景:
- 窗体通过反射实例化(比如
Activator.CreateInstance(typeof(YourForm))或者用字符串类名创建),这种动态调用静态分析识别不了 - 配置文件、数据库甚至硬编码的字符串里存了窗体类名,用来动态创建实例,Code Analyzer也搜不到这些间接引用
- 如果你只分析了单个项目,而窗体被解决方案里的其他项目引用了,结果也会不准确
VS2017 Enterprise里可以用的其他方法
1. 用VS自带的「查找所有引用」进阶功能
选中窗体类名(比如public class MyUnusedForm : Form里的MyUnusedForm),右键选择「查找所有引用」,注意在弹出的结果窗口里把「查找范围」设为整个解决方案。不过要留意结果里的内容,排除掉注释、字符串字面量里的同名内容。
2. 借助Resharper(如果已安装)
如果你装了Resharper(VS2017 Enterprise可以兼容),它的「Find Unused Code」功能比VS自带工具更精准,能识别更多间接引用场景,甚至能标记出只在特定条件下被引用的代码。不过同样,反射类的动态调用它也无能为力。
3. 手动排查动态引用场景
必须手动检查这些静态工具覆盖不到的地方:
- 搜索整个解决方案里的
Activator.CreateInstance、Assembly.CreateInstance、Type.GetType这些反射相关的方法,看看有没有用到窗体的类名 - 检查
app.config、Settings.settings等配置文件,有没有存储窗体的类型名称 - 查看项目里有没有自定义的窗体工厂、导航类,这些地方通常会动态创建窗体实例
4. 临时移除测试法
如果对某个窗体的引用情况存疑,可以先尝试把它从项目中移除(或者注释掉项目文件里的引用),然后编译整个解决方案:
- 如果有编译错误,说明存在静态引用,根据错误提示就能找到引用位置
- 如果编译通过,还得运行应用做测试——因为反射调用的窗体在运行时才会报错,这时候要留意日志或者运行时异常
总结
Code Analyzer只是第一步,要彻底找出所有未被引用的窗体,必须结合VS自带的查找工具、第三方插件(如果有的话),再加上手动排查动态引用的场景,才能确保没有遗漏。
内容的提问来源于stack exchange,提问作者Michelle
相关产品推荐
相关产品推荐

