60 votes

Trouver des ressources non utilisées dans une solution .NET

Comment trouver des icônes, des images et des chaînes inutilisées dans des fichiers .resx qui sont devenus "orphelins" et ne sont plus nécessaires?

11voto

jitbit Points 8072

J'ai créé une extension VS open-source gratuite qui recherche les images inutilisées dans un projet. Je viens de publier la première version: https://bitbucket.org/jitbit/vsunusedimg/wiki/Home.

8voto

David Schmitt Points 29384

Ce n'est pas de l'information un algorithme permet de calculer de manière fiable. Le inspecté programme pourrait récupérer une liste de toutes les ressources et de faire quelque chose avec eux, comme permettant à l'utilisateur de choisir à partir de plusieurs icônes.

Votre meilleur pari est probablement à rechercher toutes les références à votre accès aux ressources de l'API de choix et d'inspecter ceux manuellement. À l'aide de grep/sed vous pourriez être en mesure de réduire les sites que vous avez à inspecter manuellement par la manipulation de tous "facile" pour lesquelles une simple chaîne de caractères est utilisée.

7voto

Uwe Keim Points 15221

Puisque je ne pouvais pas trouver un simple et rapide encore trouvé de solution, j'ai trouvé au moins une solution qui me permet d'obtenir le résultat que je cherche, même si cela prend un certain temps (idéal pour un paresseux dimanche après-midi).

La solution consiste à Visual Studio .NET 2010 et ReSharper (j'utilise la version 7.1) et qui va comme suit.

Étape-par-étape de la solution

1.) Cliquez-droit sur votre premier fichier RESX dans VS.NET et sélectionnez "Rechercher des Usages" dans le menu contextuel:

enter image description here

Cela fera apparaître ReSharper "Trouver" Résultats de la fenêtre.

2.) Double-cliquez sur chaque événement dans la solution de la fenêtre:

enter image description here

Cela va ouvrir la fenêtre de code source avec la ressource.

3.) Renommer cette ressource à partir de l'intérieur de la fenêtre de code source:

enter image description here

Il fera apparaître ReSharper de "Renommer Ressource de boîte de dialogue".

4.) Donner à la ressource un nouveau nom avec un préfixe unique. Dans mon exemple c'est "TaskDialog_":

enter image description here

Il va renommer à la fois la ressource et aussi l'auto-générés C# wrapper/classe d'accès.

5.) Répéter les étapes 2, 3 et 4 pour toutes les ressources dans les "Usages" de la fenêtre.

6.) Ouvrir le fichier RESX dans Visual Studio, l'éditeur de ressource et sélectionnez tous les fichiers sans le préfixe:

enter image description here

7.) Maintenant, cliquez sur "Supprimer les Ressources" bouton sur le haut de la fenêtre ou appuyez simplement sur la Del clé:

enter image description here

Vous avez enfin un fichier RESX avec seulement le acutally utilisé les ressources de votre fichier.

8.) (En option) Si vous avez des ressources en plusieurs langues (par exemple, "des Ressources.de.resx" pour l'allemand), répétez les étapes 7 et 8 pour ceux fichiers RESX, trop.

Avertissement

Veuillez noter que cela ne fonctionnera pas si vous avez accès à vos chaînes autres que par le biais d'fortement typées, auto-généré de classe C# Resources.

6voto

votrubac Points 51

J'ai récemment construit un outil qui détecte et supprime les ressources de chaîne inutilisés. J'ai utilisé les informations contenues dans ce post comme une référence. L'outil ne peut pas être parfait, mais il fait le gros du travail de la partie et sera utile si vous avez un gros projet avec la longue histoire. Nous avons utilisé cet outil en interne pour consolider les fichiers de ressources, et de supprimer des ressources non utilisées (nous nous sommes débarrassés de+ de 4000 ressources sur 10 000).

Vous pouvez regarder le code source, ou il suffit d'installer ClickOnce à partir d'ici: https://resxutils.codeplex.com/

3voto

Craig Stewart Points 21

J'ai eu un problème similaire. Plusieurs milliers de chaînes de ressource que j'avais créé pour une table de traduction, dont beaucoup n'étaient plus nécessaires ou de référence par le code. Avec près de 180 dépendante des fichiers de code, il n'y avait pas moyen que j'allais aller manuellement par chaque chaîne de ressource.

Le code suivant (dans vb.net va par le biais de votre projet, trouver des orphelins de ressources. Il a fallu environ 1 minute pour mon projet. Il peut être modifié pour rechercher des chaînes, des images ou tout autre type de ressource.

En résumé, il;

  • 1) Utilise la solution fichier de projet pour rassembler tous les code les modules et les ajoute en une seule variable de chaîne;
  • 2) Boucle par tous les objets de ressource, et crée une liste (dans mon cas) de ceux qui sont des chaînes de caractères;
  • 3) une chaîne de recherche, de trouver des ressources de la chaîne de codes dans l'ensemble des projets de texte variable;
  • 4) les Rapports des objets de ressource qui ne sont pas référencées.

La fonction retourne les noms des objets sur le presse-papiers de windows pour la coller dans une feuille de calcul ou un tableau contenant une liste de noms de ressources.

'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 XmlTextReader = New XmlTextReader(projectFile)
    Do While (reader.Read())
        Select Case reader.NodeType
            Case 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

    ' 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
        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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X