Найти неиспользуемые ресурсы в .NET-решении - PullRequest
53 голосов
/ 29 октября 2008

Как вы находите неиспользуемые значки, изображения, строки в файлах .resx, которые могли стать «осиротевшими» и больше не нужны?

Ответы [ 10 ]

36 голосов
/ 04 сентября 2014

Недавно ResXManager 1.0.0.41 добавлена ​​функция отображения количества ссылок на строковый ресурс.

Screenshot showing the new reference column

15 голосов
/ 28 октября 2014

Я не смог найти ни одного существующего решения, которое могло бы искать ссылки на строковые ресурсы в файлах XAML и удалять из пакета неиспользуемые.

Итак, я написал это: https://github.com/Microsoft/RESX-Unused-Finder

RESX Unused Finder screenshot

Он ищет в каталоге проекта ссылки на строковые ресурсы, а затем отображает список тех, для которых он не может найти соответствия. Вы можете указать шаблон для поиска, чтобы он мог найти ссылки в файлах XAML.

11 голосов
/ 23 марта 2012

Я создал бесплатное расширение VS с открытым исходным кодом, которое ищет неиспользуемые изображения в проекте, только что опубликовал первую версию: https://marketplace.visualstudio.com/items?itemName=Jitbit1.VSUnusedImagesFinder

10 голосов
/ 29 октября 2008

Это не информация, которую алгоритм может надежно вычислить. Проверяемая программа может получить список всех ресурсов и что-то с ними сделать, например, позволить пользователю выбирать из нескольких значков.

Лучше всего вам искать все ссылки на выбранный вами API доступа к ресурсам и проверять их вручную. Используя grep / sed, вы можете сократить количество сайтов, которые вы должны проверять вручную, обработав все «простые», где используется простая строка.

6 голосов
/ 28 октября 2013

Я недавно создал инструмент, который обнаруживает и удаляет неиспользуемые строковые ресурсы. Я использовал информацию в этом посте в качестве ссылки. Инструмент может быть не идеальным, но он делает тяжелую часть и будет полезен, если у вас большой проект с длинной историей. Мы использовали этот инструмент для консолидации файлов ресурсов и удаления неиспользуемых ресурсов (мы избавились от 4000+ ресурсов из 10000).

Вы можете посмотреть исходный код или просто установить ClickOnce отсюда: https://resxutils.codeplex.com/

6 голосов
/ 09 декабря 2012

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

Решение включает в себя Visual Studio .NET 2010 и ReSharper (я использую версию 7.1) и работает следующим образом.

Пошаговое решение

1.) Щелкните правой кнопкой мыши основной файл RESX в VS.NET и выберите «Найти использование» в контекстном меню:

enter image description here

Откроется окно ReSharper «Find Results».

2.) Дважды щелкните каждое вхождение в окне решения:

enter image description here

Откроется окно исходного кода с ресурсом.

3.) Переименуйте этот ресурс в окне исходного кода:

enter image description here

Откроется диалоговое окно ReSharper «Rename Resource».

4.) Дайте ресурсу новое имя с уникальным префиксом . В моем примере это «TaskDialog _»:

enter image description here

Он будет переименовывать как ресурс, так и автоматически сгенерированный C # -обертку / класс доступа.

5.) Повторите вышеуказанные шаги 2, 3 и 4 для всех ресурсов в окне «Использование».

6.) Откройте файл RESX в редакторе ресурсов Visual Studio и выберите все файлы без префикса:

enter image description here

7.) Теперь нажмите кнопку «Удалить ресурс» в верхней части окна или просто нажмите клавишу Del :

enter image description here

Наконец-то у вас есть файл RESX, в котором содержатся только ресурсы, используемые в действительности.

8.) (Опционально) Если у вас есть ресурсы на нескольких языках (например, «Resources.de.resx» для немецкого), повторите шаги 7 и 8 для этих файлов RESX.

Внимание

Обратите внимание, что это не будет работать, если вы обращаетесь к своим строкам, кроме как через строго типизированный, автоматически сгенерированный класс C # Resources.

3 голосов
/ 14 февраля 2013

У меня была похожая проблема. Несколько тысяч строк ресурсов, которые я создал для таблицы перевода, многие из которых больше не требуются или не ссылаются на код. Приблизительно с 180 зависимыми файлами кода я никак не мог вручную просмотреть каждую строку ресурса.

Следующий код (на vb.net) поможет вам найти потерянные ресурсы ресурсах проекта , а не ресурсах отдельных форм ). На мой проект ушло около 1 минуты. Его можно изменить, чтобы найти строки, изображения или любой другой тип ресурса.

В итоге это;

  • 1) Использует файл проекта решения для сбора всего включенного кода модули и добавляет их в одну строковую переменную;
  • 2) Перебирает все объекты ресурса проекта и создает список (в моем случае) тех, которые являются строками;
  • 3) Поиск строки находит коды строки ресурса в текстовой переменной объединенного проекта;
  • 4) Сообщает об объектах ресурсов, на которые нет ссылок.

Функция возвращает имена объектов в буфере обмена Windows для вставки в электронную таблицу или в виде массива списка имен ресурсов.

edit : пример вызова в модуле: modTest
? modTest.GetUnusedResources("C:\Documents and Settings\me\My Documents\Visual Studio 2010\Projects\myProj\myProj.vbproj", True, true)

'project file is the vbproj file for my solution
Public Function GetUnusedResources(projectFile As String, useClipboard As Boolean, strict As Boolean) As List(Of String)


    Dim myProjectFiles As New List(Of String)
    Dim baseFolder = System.IO.Path.GetDirectoryName(projectFile) + "\"

    'get list of project files 
    Dim reader As Xml.XmlTextReader = New Xml.XmlTextReader(projectFile)
    Do While (reader.Read())
        Select Case reader.NodeType
            Case Xml.XmlNodeType.Element 'Display beginning of element.
                If reader.Name.ToLowerInvariant() = "compile" Then ' only get compile included files
                    If reader.HasAttributes Then 'If attributes exist
                        While reader.MoveToNextAttribute()
                            If reader.Name.ToLowerInvariant() = "include" Then myProjectFiles.Add((reader.Value))
                        End While
                    End If
                End If
        End Select
    Loop

    'now collect files into a single string
    Dim fileText As New System.Text.StringBuilder
    For Each fileItem As String In myProjectFiles
        Dim textFileStream As System.IO.TextReader
        textFileStream = System.IO.File.OpenText(baseFolder + fileItem)
        fileText.Append(textFileStream.ReadToEnd)
        textFileStream.Close()
    Next
    '  Debug.WriteLine(fileText)

    ' Create a ResXResourceReader for the file items.resx.
    Dim rsxr As New System.Resources.ResXResourceReader(baseFolder + "My Project\Resources.resx")
    rsxr.BasePath = baseFolder + "Resources"
    Dim resourceList As New List(Of String)
    ' Iterate through the resources and display the contents to the console.
    For Each resourceValue As DictionaryEntry In rsxr
        ' Debug.WriteLine(resourceValue.Key.ToString())
        If TypeOf resourceValue.Value Is String Then ' or bitmap or other type if required
            resourceList.Add(resourceValue.Key.ToString())
        End If
    Next
    rsxr.Close()  'Close the reader.

    'finally search file string for occurances of each resource string
    Dim unusedResources As New List(Of String)
    Dim clipBoardText As New System.Text.StringBuilder
    Dim searchText = fileText.ToString()
    For Each resourceString As String In resourceList
        Dim resourceCall = "My.Resources." + resourceString ' find code reference to the resource name
        Dim resourceAttribute = "(""" + resourceString + """)" ' find attribute reference to the resource name
        Dim searchResult As Boolean = False
        searchResult = searchResult Or searchText.Contains(resourceCall)
        searchResult = searchResult Or searchText.Contains(resourceAttribute)
        If Not strict Then searchResult = searchResult Or searchText.Contains(resourceString)
        If Not searchResult Then ' resource name no found so add to list
            unusedResources.Add(resourceString)
            clipBoardText.Append(resourceString + vbCrLf)
        End If
    Next

    'make clipboard object
    If useClipboard Then
        Dim dataObject As New DataObject ' Make a DataObject clipboard
        dataObject.SetData(DataFormats.Text, clipBoardText.ToString())        ' Add the data in string format.
        Clipboard.SetDataObject(dataObject) ' Copy data to the clipboard.
    End If

    Return unusedResources

End Function
2 голосов
/ 13 июня 2014

Я использую ReSharper для поиска неиспользуемых полей ресурсов, а затем удаляю их вручную, если проект содержит небольшое количество ресурсов. Некоторый короткий сценарий можно использовать, если у нас уже есть список неиспользуемых элементов.

Решение следующее:

  • показать всех неиспользованных членов, как описано в этой статье
  • временное удаление * .Designer.cs из сгенерированных масок файлов (ReSharper → Параметры → Проверка кода → Сгенерированный код)
  • Также комментируйте или удаляйте комментарий (который указывает, что код автоматический генерируется) из верхней части файла Designer.cs, прикрепленного к файлу ресурса.

У вас будет список всех неиспользованных ресурсов, оставленных для удаления их из resx.

1 голос
/ 04 февраля 2011

Переименуйте ваш текущий каталог изображений, а затем создайте новый, выполните поиск в файлах в VS для вашего пути к изображению, то есть '/ content / images', выделите все используемые изображения и перетащите их в новое изображение. папка. Затем вы можете исключить старый каталог из проекта или просто удалить его.

1 голос
/ 30 июня 2009

Я сам обдумывал это и считаю, что у меня есть два варианта. Оба из них полагаются на тот факт, что я использую вспомогательный метод для извлечения необходимого ресурса из файлов ресурсов.

  1. Регистрация
    Добавьте некоторый код в метод или методы getresource, чтобы при каждом обращении к ресурсу ключ ресурса записывался в журнал. Затем попробуйте получить доступ ко всем частям сайта (здесь может пригодиться сценарий тестирования). Результирующие записи журнала должны содержать список всех активных ключей ресурсов, остальные могут быть уничтожены.

  2. Анализ кода
    Я смотрю на то, способен ли T4 работать через решение и создать список всех ссылок на вспомогательный метод getresource. Результирующий список ключей будет активным, остальные могут быть удалены.

Существуют ограничения обоих методов. Метод регистрации эффективен только в том случае, если код, описанный в тесте, анализ кода не всегда находит ключи, а не строки, связывающие ключи, поэтому здесь потребуется дополнительная ручная работа.

Я думаю, что попробую оба. Я дам вам знать, как это происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...