Подтвердить что ты не робот

Поиск неиспользуемых ресурсов в .NET-решении

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Screenshot showing the new reference column

Ответ 3

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

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

RESX Unused Finder screenshot

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

Ответ 4

Я создал бесплатное расширение VS с открытым исходным кодом, которое ищет неиспользуемые изображения в проекте, только что опубликовал первую версию: https://github.com/jitbit/vs-unused-image-finder

Ответ 5

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

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

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

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

enter image description here

Появится окно "Результаты поиска" ReSharper.

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

enter image description here

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

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

enter image description here

Появится диалоговое окно ReSharper "Переименовать ресурс".

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

enter image description here

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

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 тоже.

Внимание

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

Ответ 6

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

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

Ответ 7

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

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

В заключение:

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

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

изменить: пример вызова в модуле: 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

Ответ 8

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

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

  • показать все неиспользуемые члены, как описано в этой статье http://chrisseroka.wordpress.com/2013/10/28/find-unused-private-and-public-methods-with-resharper/
  • временный удалить *.Designer.cs из сгенерированных файловых масок (ReSharper- > Настройки- > CodeInspection- > GeneratedCode)
  • Также комментарий или удаление комментария (что указывает, что код авто генерируется) из файла Designer.cs, прикрепленного к файлу ресурсов.

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

Ответ 9

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

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

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

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

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

Ответ 10

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