如何从我的项目中删除不必要的资源?

Posted

技术标签:

【中文标题】如何从我的项目中删除不必要的资源?【英文标题】:How do I remove unnecessary resources from my project? 【发布时间】:2009-09-30 08:10:42 【问题描述】:

我正在处理一个非常大的项目(一个包含 16 个项目的解决方案,每个项目包含大约 100 个文件)。

它是用 Visual Studio 2005 用 C++/C# 编写的。 其中一个项目有大约 2000 个资源,其中只有 400 个被实际使用。如何删除那些未使用的资源?

我试图通过搜索旧的来完成任务。 它有效,我能够构建解决方案,但它在运行时中断。

我猜是因为使用了 enum。 (重要

如何确保它不会在运行时中断?

编辑: 我认为一种方法可能是在运行时(以某种方式)动态生成资源(未找到)。 但我不知道... 任何事情

注意:如果一些不必要的资源仍然存在也没关系。

【问题讨论】:

如果你的意思是清理 resx 文件,SharpDevelop 就有这样的功能。 (sharpdevelop.net) 我不会将具有 1600 个源文件的系统称为“非常大”。适度,也许,但不是“非常大”。再加一个零,你就接近“非常大”了。 【参考方案1】:

我要做的是编写一个自定义工具来搜索您的源代码。

如果您从头文件(即可能称为 resource.h)中删除资源 ID,然后重新编译并且没有收到警告:那么这是一件好事。

以下是我编写应用程序的方式。将您要审查的资源文件 (resource.h) 作为输入。打开头文件 (*.h) 并解析所有资源常量(或至少您感兴趣的一次)。将它们存储在哈希表中,以便以后快速查找。 对于项目中的每个代码文件,在文本中搜索每个资源 ID 的实例。使用资源 ID 时,增加哈希表中的值,否则将其保留为零。 最后,将所有归零的资源 ID 转储到日志文件或其他内容中。然后测试您确实可以安全地删除那些指定的资源 ID。一旦你这样做了,然后根据你的日志文件的结果编写另一个删除指定资源 ID 的工具。

您可以在 perl 中编写这样的工具,它会在大约 0.3 秒内执行:但调试需要几天时间。 :) 或者您可以在 .NET 中编写它,它的执行速度会慢一些,但需要一个小时来调试。 :)

【讨论】:

【参考方案2】:

您可以将 Visual Studio 的第三方插件用作 ReSharper。此加载项将分析您的 C# 代码并指出未使用的资源。但它只适用于 C#。

【讨论】:

【参考方案3】:

对于 C++ 项目,请查看 Riverblade 的 ResOrg

“资源 ID 管理器(简称 ResOrg)是 Visual C++ 的插件,旨在帮助克服开发/维护 Windows 应用程序中最烦人(也是不必要)的琐事之一 - 维护资源符号 ID 值”

http://www.riverblade.co.uk/products/resorg/index.html

【讨论】:

【参考方案4】:

我从来没有吃过这么差的。我在编译程序中的方法是使用模拟 GREP 的 REXX 脚本来查找对我怀疑没有被使用的源的引用,将它们从程序中删除,看看有什么问题。我使用 REXX 脚本是因为我可以预先过滤我想要搜索的文件列表。这使我可以跨文件夹和计算机进行搜索。

【讨论】:

【参考方案5】:

如果您的代码在运行时包含动态加载资源(例如通过字符串),则无法自动确定哪些资源可以从源中安全删除。动态加载语句可以加载任何资源。

最好的办法是从应用的精简版本开始,运行它,并在测试时确定缺少哪些资源。然后将它们重新添加并重新测试。

【讨论】:

【参考方案6】:

您可能想看看工具Reflector(免费),不要与ReSharper(昂贵)混淆。它可以显示哪些 DLL 依赖于另一个。然后,如果您愿意,您可以删除没有被其他任何东西引用的 DLL。请注意您是否使用了依赖注入或反射,这可能会在您不知情的情况下破坏您的代码。

反射器: http://www.red-gate.com/products/reflector/.

此插件绘制程序集依赖图和 IL 图: http://reflectoraddins.codeplex.com/Wiki/View.aspx?title=Graph.

【讨论】:

Reflector 不再免费(啤酒)。【参考方案7】:

在解决方案资源管理器的“资源视图”中,右键单击并选择“资源符号”。现在您将获得一个列表,您可以在其中查看 .RC 文件中使用了哪些资源常量。这可能会帮助您清理 Resource.h(尽管它不会显示实际 C++ 代码中未使用哪些资源)。

【讨论】:

【参考方案8】:

也许Find Unused Resources in a .NET Solution 在这里有帮助?基本上,您必须检查使用了哪些资源(例如通过全面的代码覆盖检查)并删除未使用的资源。

也许你不应该害怕使用跟踪和错误的方法来清理。

【讨论】:

【参考方案9】:

Solution Explorer中,右键单击Reference,然后单击菜单项Find Dependent Code

如果它找不到任何依赖代码,那么您可以从项目中删除此引用。 (删除操作也在右键菜单下。)

编辑:对于大型项目,Find Dependent Code 操作将花费 很长 时间。因此,由于您有 2000 个资源并且很可能重视您的时间,这可能不是一个可行的选择....

【讨论】:

【参考方案10】:

对于 C++ 资源,您是否尝试在“资源视图”中右键单击项目,然后删除旁边没有勾号的项目?删除未使用的对话框资源是不安全的,因为它们在代码中被称为“枚举”(如下所示)。

enum  IDD = IDD_ABOUTBOX ;

..但是对于所有其他人来说它应该是安全的。

【讨论】:

以上是关于如何从我的项目中删除不必要的资源?的主要内容,如果未能解决你的问题,请参考以下文章

如何从我的 Eclipse 项目中删除 javascript 验证?

如何从我的包用户的导入语句中删除输出文件夹?

从我的项目中删除 .edmx

Cocoapod:为啥 Xcode 构建过程试图找到已经从我的项目中删除的库

如何从 QT 项目中正确删除 QML 文件

如何从我在 Google Cloud Platform 上的部署中删除 Kubernetes 仪表板资源?