Найти неиспользуемые ресурсы в a.NET решение


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

10 53

10 ответов:

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

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

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

Screenshot showing the new reference column

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

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

RESX Unused Finder screenshot

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

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

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

решение включает 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

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

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

enter image description here

он переименует как ресурс, так и автоматически созданный класс c# wrapper/access.

5.) повторите описанные выше шаги 2, 3 и 4 для всех ресурсов в окне "Usages".

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

enter image description here

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

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

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

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

следующий код (in 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

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

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

  • показать все неиспользуемые элементы, как описано в в этой статье
  • временные удалить *.Дизайнер.cs из созданных масок файлов (ReSharper → Опции → CodeInspection → GeneratedCode)
  • также комментарий или удалить комментарий (это означает, что код является автоматическим генерируется) из верхней части конструктора.cs-файл, прикрепленный к файлу ресурсов.

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

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

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

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

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

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

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