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?
Réponses
Trop de publicités?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.
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.
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:
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:
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:
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_":
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:
7.) Maintenant, cliquez sur "Supprimer les Ressources" bouton sur le haut de la fenêtre ou appuyez simplement sur la Del clé:
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
.
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/
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