Как удалить ненужные ресурсы из моего проекта?

Я работаю с очень большим проектом (решение, содержащее 16 проектов, и каждый проект содержит около 100 файлов).

Он написан на С++/С# с Visual Studio 2005.
В одном из проектов имеется около 2000 ресурсов, из которых фактически используются только 400.
Как удалить неиспользуемые ресурсы?

Я попытался выполнить задачу, выполнив поиск использованных.
Это сработало, и я смог построить решение, но оно сломалось во время выполнения.

Я предполагаю, что используются перечисление. (ВАЖНО)

Как я могу убедиться, что он не сломается во время выполнения?

РЕДАКТИРОВАТЬ:
Я думаю, что одним из способов может быть создание ресурса (который не найден) "на лету" во время выполнения (каким-то образом).
Но я понятия не имею о... ничего.

ПРИМЕЧАНИЕ. Все в порядке, если еще несколько лишних ресурсов.

Ответы

Ответ 1

Что бы я сделал, это написать собственный инструмент для поиска исходного кода.

Если вы удалите идентификатор ресурса из файла заголовка (т.е., возможно, назвали resource.h), а затем перекомпилируйте и не получите никаких предупреждений: тогда это хорошо.

Вот как я буду писать приложение. Возьмите в качестве входного файла ресурса (resource.h), который вы хотите изучить. Откройте файл заголовка (*.h) и проанализируйте все константы ресурса (или, по крайней мере, интересующие вас группы). Храните их в хэш-таблице для быстрого поиска позже. Для каждого файла кода в вашем проекте найдите текст для экземпляров каждого из ваших идентификаторов ресурса. Когда используется идентификатор ресурса, увеличивайте значение в хеш-таблице, иначе оставьте его равным нулю. В конце дамп все ИД ресурса, которые обнуляют файл журнала или что-то в этом роде. Затем проверьте, действительно ли вы можете безопасно удалить указанные идентификаторы ресурсов. Как только вы это сделаете, напишите еще один инструмент, который удаляет указанный идентификатор ресурса с учетом результатов вашего файла журнала.

Вы можете написать такой инструмент в perl, и он выполнится примерно через 0,3 секунды: но для отладки потребуется несколько дней.:) Или вы могли бы написать это в .NET, и это будет выполняться немного медленнее, но вам потребуется час для отладки.:)

Ответ 2

Вы можете использовать сторонний плагин для Visual Studio в качестве ReSharper. Эта надстройка будет анализировать ваш код С# и указывать неиспользуемые ресурсы. Но он работает только с С#.

Ответ 3

Для проектов на С++ ознакомьтесь с ResOrg от Riverblade.

"Организатор идентификаторов ресурсов (ResOrg для краткости) - это надстройка для Visual С++, предназначенная для преодоления одной из самых раздражающих (и ненужных) задач разработки/поддержки приложений Windows - сохранения значений идентификаторов ресурсов ресурса"

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

Ответ 4

У меня никогда не было такого плохого. Мой метод в скомпилированных программах - использовать REXX script, который эмулирует GREP, ищущий ссылки на источник, который, как я подозреваю, не используется, удаляет их из программы и видит, что происходит. Я использую REXX script, потому что я могу предварительно фильтровать список файлов, которые я хочу найти. Это позволяет мне выполнять поиск по папкам и компьютерам.

Ответ 5

Вы можете взглянуть на инструмент Reflector (бесплатно), чтобы не путать с ReSharper (дорогой). Он может показать вам, какие DLL файлы зависят от другого. Затем, если вы хотите, вы сможете удалить DLL, на которую не ссылается ничто иное. Следите за тем, используете ли вы инъекцию или отражение зависимостей, которые затем могут нарушить ваш код без вашего ведома.

Отражатель: http://www.red-gate.com/products/reflector/.

Эта надстройка рисует графики зависимостей сборки и графики IL: http://reflectoraddins.codeplex.com/Wiki/View.aspx?title=Graph.

Ответ 6

Если ваш код содержит динамическую загрузку ресурсов (например, через строки) во время выполнения, то нет возможности автоматически определять, какие ресурсы можно безопасно удалить из источника. Оператор динамической загрузки может загружать любой ресурс.

Лучше всего начать с вашей урезанной версии приложения, запустить ее и определить, какие ресурсы отсутствуют при ее тестировании. Затем добавьте их обратно и повторите проверку.

Ответ 7

В окне "Ресурсы" в обозревателе решений щелкните правой кнопкой мыши и выберите "Обозначения ресурсов". Теперь вы получаете список, в котором вы можете видеть, какие константы ресурсов используются в .RC файле. Это поможет вам немного поправить очистку ресурса .h(хотя он не показывает, какие ресурсы не используются в реальном коде на С++).

Ответ 8

Возможно Найти неиспользуемые ресурсы в .NET Solution здесь? В принципе, вам нужно будет проверить, какие ресурсы используются (например, с помощью всеобъемлющих проверок покрытия кода) и удалить неиспользуемые.

И, вероятно, вы не должны бояться, используя метод отслеживания и ошибок для очистки.

Ответ 9

В Обозреватель решений щелкните правой кнопкой мыши и нажмите Ссылка и выберите пункт меню Найти зависимый код.

Если он не может найти зависимый код, вы можете удалить эту ссылку из проекта. (Операция Удалить также находится под контекстным меню.)

EDIT: Для большого проекта операция поиска зависимого кода займет много времени. Так как у вас есть 2000 ресурсов и, скорее всего, ценность вашего времени, это, вероятно, не жизнеспособный вариант....

Ответ 10

Для ресурсов С++ вы попытались щелкнуть правой кнопкой мыши проект в "Ресурсном представлении", а затем удалить те, у которых нет метки рядом с ними? Небезопасно удалять неиспользуемые ресурсы диалога, поскольку на них ссылаются как "перечисление" в коде (например, следующее).

enum { IDD = IDD_ABOUTBOX };

.. однако для всех остальных это должно быть безопасно.