2009-09-30 66 views
14

我正在处理一个非常大的项目(一个包含16个项目的解决方案,每个项目包含大约100个文件)。如何从我的项目中删除不必要的资源?

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

我试图通过搜索使用的任务来完成任务。
它工作,我能够建立解决方案,但它在运行时崩溃。

我想因为enum s被使用。 (重要

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

编辑:
我想一个方法可以生成资源(即未找到)在飞行运行时(不知)。
但我不知道... 什么东西

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

+1

如果你的意思是resx文件清理,SharpDevelop有这样的功能。 (http://www.sharpdevelop.net) –

+0

它使用C++吗? –

+0

我不会调用1600个源文件“非常大”的系统。也许中等,但不是“非常大”。再加上一个零,你即将接近“非常大”。 – JesperE

回答

4

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

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

这里是我将如何去写应用程序。以输入您要查看的资源文件(resource.h)作为输入。打开头文件(* .h)并解析所有的资源常量(或者至少你感兴趣的东西)。将它们存储在散列表中以便稍后快速查找。 对于项目中的每个代码文件,请在文本中搜索每个资源ID的实例。当使用资源ID时,增加散列表中的值,否则将其保留为零。 最后,转储日志文件中的所有资源ID为零。然后测试确实可以安全地删除那些指定的资源ID。一旦你这样做,然后写另一个工具,删除指定的资源ID的日志文件的结果。

您可以在perl中编写这样一个工具,它将在大约0.3秒内执行:但是需要数天才能进行调试。 :) 或者你可以写在这。NET,它会执行速度稍慢一点,但会花一个小时来调试。 :)

+1

非常酷:-) + 1A –

0

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

也许你应该不会害怕通过使用线索和错误的方法来清理。

+0

我只是这样做了。但:( –

1

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

1

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

“资源ID组织者(简称ResOrg)是Visual C++的一个插件,用于帮助克服开发/维护Windows应用程序中最烦人的(和不必要的)任务 - 维护资源符号ID值”

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

0

Solution Explorer中,点击右键,在参考,然后点击菜单项查找相关代码

如果找不到任何相关代码,则可以从该项目中删除此引用。 (删除操作也在右键菜单下。)

编辑:对于大型项目,查找相关代码操作将需要时间。所以,既然你有2000点的资源,最有可能你的时间,这可能是一个可行的选择....

1

我从来没有一个说不好。我在编译的程序中使用的方法是使用一个模拟GREP的REXX脚本,查找我怀疑没有使用的源的引用,将它们从程序中移除并查看什么是中断。我使用REXX脚本是因为我可以预先筛选我想要搜索的文件列表。这使我可以在文件夹和计算机上进行搜索。

1

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

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

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

+1

反射器不再是免费的(啤酒) – Bobby

1

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

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

0

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

enum { IDD = IDD_ABOUTBOX }; 

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

1

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

相关问题