代码之家  ›  专栏  ›  技术社区  ›  Pratik Deoghare

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

  •  14
  • Pratik Deoghare  · 技术社区  · 16 年前

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

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

    我试图通过寻找二手货来完成这项任务。
    它起作用了,我能够构建解决方案,但在运行时就坏了。

    我猜是因为 枚举 使用S。( 重要的 )

    如何确保它在运行时不会损坏?

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

    注意:如果还有一些不必要的资源,也可以。

    10 回复  |  直到 11 年前
        1
  •  4
  •   C.J.    15 年前

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

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

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

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

        2
  •  1
  •   Patrice Bernassola    16 年前

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

        3
  •  1
  •   Lior Kogan    16 年前

    对于C++项目,请检查 再吸收 来自RiverBlade。

    “资源ID组织者(简称RESG)是VisualC++的一个插件,旨在帮助克服开发/维护Windows应用程序中最烦人的(不必要的)琐事之一——维护资源符号ID值”

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

        4
  •  1
  •   Dave    16 年前

    我从来没有这么糟糕过。我在编译程序中的方法是使用一个rexx脚本来模拟grep,寻找我怀疑没有使用的源代码的引用,从程序中删除它们,然后看看有什么中断。我使用rexx脚本是因为我可以预先过滤要搜索的文件列表。它允许我在文件夹和计算机之间进行搜索。

        5
  •  1
  •   Daniel Earwicker    16 年前

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

    你最好的选择是从你修剪过的应用程序版本开始,运行它,并在测试时确定哪些资源丢失了。然后把它们加回去重新测试。

        6
  •  1
  •   Peter Mortensen Pieter Jan Bonestroo    15 年前

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

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

    此加载项绘制程序集依赖关系图和IL图: http://reflectoraddins.codeplex.com/Wiki/View.aspx?title=Graph .

        7
  •  1
  •   Corlin    11 年前

    在解决方案资源管理器的“资源视图”中,右键单击并选择“资源符号”。现在,您可以看到在.rc文件中使用了哪些资源常量。这可能有助于清理资源。虽然它没有显示在实际C++代码中没有使用哪些资源。

        8
  •  0
  •   Community Mohan Dere    8 年前

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

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

        9
  •  0
  •   Chris    16 年前

    解决方案管理器 ,右键单击 参考文献 然后点击菜单项 查找依赖代码 .

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

    编辑: 对于大型项目,查找相关代码操作将 长的 时间。既然你有2000个资源 价值 你的时间可能是 一个可行的选择……

        10
  •  0
  •   Ugur Turan    16 年前

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

    enum { IDD = IDD_ABOUTBOX };
    

    但是对于其他人来说应该是安全的。