Как вы можете найти неиспользуемые значки, изображения, строки в файлах .resx, которые, возможно, стали "потерянными" и больше не требуются?
Поиск неиспользуемых ресурсов в .NET-решении
Ответ 1
Это не информация, которую алгоритм может надежно вычислить. Проверенная программа может получить список всех ресурсов и сделать что-то с ними, например, позволить пользователю выбрать несколько значков.
Лучше всего, вероятно, найти все ссылки на ваш API доступа к ресурсам и проверить их вручную. Используя grep
/sed
, вы можете уменьшить количество сайтов, которые вы должны проверять вручную, используя все "простые", где используется простая строка.
Ответ 2
Недавно ResXManager 1.0.0.41 добавлена функция, показывающая количество ссылок на строковый ресурс.
Ответ 3
Я не мог найти какое-либо существующее решение, которое будет искать ссылки на ссылки на строки в файлах XAML и пакетно-удалить неиспользуемые.
Итак, я написал это: https://github.com/Microsoft/RESX-Unused-Finder
Он ищет каталог проекта для ссылок на строковые ресурсы, а затем отображает список тех, которые не удалось найти. Вы можете указать шаблон для поиска, чтобы он мог найти ссылки в файлах XAML.
Ответ 4
Я создал бесплатное расширение VS с открытым исходным кодом, которое ищет неиспользуемые изображения в проекте, только что опубликовал первую версию: https://github.com/jitbit/vs-unused-image-finder
Ответ 5
Поскольку я не мог найти простое и быстрое решение, я нашел хотя бы решение, которое позволяет мне получить результат, который я ищу, даже если это занимает некоторое время (идеально подходит для ленивого воскресного дня).
Решение включает Visual Studio.NET 2010 и ReSharper (я использую версию 7.1) и выглядит следующим образом.
Пошаговое решение
1.) Щелкните правой кнопкой мыши свой основной файл RESX в VS.NET и выберите "Найти использование" в контекстном меню:
Появится окно "Результаты поиска" ReSharper.
2.) Дважды щелкните каждое вхождение в окне решения:
Это откроет окно исходного кода с ресурсом.
3.) Переименуйте этот ресурс из окна исходного кода:
Появится диалоговое окно ReSharper "Переименовать ресурс".
4.). Дайте ресурсу новое имя с уникальным префиксом. В моем примере это "TaskDialog _":
Он переименует как ресурс, так и автоматически сгенерированный класс оболочки/класса С#.
5.) Повторите описанные выше шаги 2, 3 и 4 для всех ресурсов в окне "Использование".
6.) Откройте файл RESX в редакторе ресурсов Visual Studio и выберите все файлы без префикса:
7.) Теперь нажмите кнопку "Удалить ресурс" в верхней части окна или просто нажмите клавишу Del:
У вас, наконец, есть файл 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", выберите все используемые изображения и перетащите их в новое изображение папка. Затем вы можете исключить старый каталог из проекта или просто удалить его.