我正在处理一个非常大的项目(一个包含16个项目的解决方案,每个项目包含大约100个文件)。
用Visual Studio 2005用C ++ / C#编写
其中一个项目有大约2000个资源,其中只有400个实际使用
如何删除这些未使用的资源?
我试图通过搜索旧的任务来完成任务
它起作用了,我能够构建解决方案,但它在运行时崩溃了。
我猜是因为使用了 enum 。 (重要)
如何确保它不会在运行时中断?
修改
我认为一种方法可能是在运行时(以某种方式)动态生成资源(未找到)。
但我不知道...... 任何事情。
注意:如果还有一些不必要的资源,那也没关系。
答案 0 :(得分:4)
我要做的是编写一个自定义工具来搜索您的源代码。
如果从头文件中删除资源ID(即可能称为resource.h),然后重新编译并且没有警告:那么这是件好事。
以下是我将如何编写应用程序。将您想要仔细检查的资源文件(resource.h)作为输入。打开头文件(* .h)并解析所有资源常量(或者至少解析您感兴趣的onces)。将它们存储在哈希表中以便以后快速查找。 对于项目中的每个代码文件,在文本中搜索每个资源ID的实例。使用资源ID时,增加哈希表中的值,否则将其保留为零。 最后,将日志文件中的所有资源ID转储为零。然后测试你确实可以安全地删除那些指定的资源ID。执行此操作后,再编写另一个工具,根据日志文件的结果删除指定的资源ID。
您可以在perl中编写这样的工具,它将在大约0.3秒内执行:但是需要几天的时间来调试。 :) 或者你可以在.NET中编写它,它会执行得慢一点,但需要一个小时来调试。 :)
答案 1 :(得分:1)
您可以将Visual Studio的第三方插件用作ReSharper。此加载项将分析您的C#代码并指出未使用的资源。但它只适用于C#。
答案 2 :(得分:1)
对于C ++项目,请查看Riverblade中的 ResOrg 。
“资源ID管理器(简称ResOrg)是Visual C ++的一个加载项,旨在帮助克服开发/维护Windows应用程序中最烦人(和不必要)的工作之一 - 维护资源符号ID值”
答案 3 :(得分:1)
我从来没有那么糟糕。我在编译程序中的方法是使用一个REXX脚本,该脚本模拟GREP,寻找我怀疑没有被使用的源的引用,从程序中删除它们,看看有什么中断。我使用REXX脚本是因为我可以预先过滤我想要搜索的文件列表。这使我可以跨文件夹和计算机进行搜索。
答案 4 :(得分:1)
您可能需要查看工具Reflector(免费),不要与ReSharper(昂贵)混淆。它可以显示哪些DLL依赖于另一个。然后,如果您希望您可能能够删除其他任何未引用的DLL。注意你是否使用依赖注入或反射,这可能会在你不知情的情况下破坏你的代码。
反射器: http://www.red-gate.com/products/reflector/
此加载项绘制程序集依赖关系图和IL图: http://reflectoraddins.codeplex.com/Wiki/View.aspx?title=Graph
答案 5 :(得分:1)
如果您的代码在运行时包含动态加载资源(例如通过字符串),则无法自动确定可以从源中安全删除哪些资源。动态加载语句可以加载任何资源。
您最好的选择是从应用程序的修剪版本开始,运行它,并在测试时确定缺少哪些资源。然后将它们重新添加并重新测试。
答案 6 :(得分:1)
在"资源视图"在解决方案资源管理器中,右键单击并选择"资源符号"。现在,您将获得一个列表,您可以在其中查看.RC文件中使用的资源常量。这有助于您清理Resource.h的方法(虽然它没有显示实际的C ++代码中没有使用哪些资源)。
答案 7 :(得分:0)
也许Find Unused Resources in a .NET Solution有帮助吗?基本上,您必须检查使用了哪些资源(例如,通过全面的代码覆盖率检查)并删除未使用的资源。
也许你不应该害怕使用追踪和错误的方法进行清理。
答案 8 :(得分:0)
在解决方案资源管理器中,右键单击参考,然后单击菜单项查找从属代码。
如果找不到任何相关代码,则可以从项目中删除此引用。 (删除操作也在右键菜单下。)
编辑:对于大型项目,查找从属代码操作将花费长时间。因此,由于您拥有2000个资源且很可能值您的时间,这可能是不一个可行的选择....
答案 9 :(得分:0)
对于C ++资源,您是否尝试右键单击“资源视图”中的项目,然后删除旁边没有刻度标记的项目?删除未使用的对话框资源是不安全的,因为它们在代码中被称为“枚举”(如下所示)。
enum { IDD = IDD_ABOUTBOX };
..然而对于所有其他人来说,它应该是安全的。