63 Stimmen

Ungenutzte Ressourcen in einer .NET-Lösung finden

Wie finden Sie ungenutzte Symbole, Bilder und Zeichenketten in .resx-Dateien, die möglicherweise "verwaist" sind und nicht mehr benötigt werden?

6voto

votrubac Punkte 131

Ich habe vor kurzem ein Tool entwickelt, das ungenutzte String-Ressourcen aufspürt und löscht. Ich habe die Informationen in diesem Beitrag als Referenz verwendet. Das Tool ist vielleicht nicht perfekt, aber es erledigt den schweren Teil der Arbeit und wird nützlich sein, wenn Sie ein großes Projekt mit einer langen Historie haben. Wir haben dieses Tool intern verwendet, um Ressourcendateien zu konsolidieren und ungenutzte Ressourcen zu entfernen (wir sind mehr als 4.000 von 10.000 Ressourcen losgeworden).

Sie können sich den Quellcode ansehen oder ClickOnce einfach von hier aus installieren: https://resxutils.codeplex.com/

3voto

Craig Stewart Punkte 41

Ich hatte ein ähnliches Problem. Mehrere tausend Ressource-Strings, die ich für eine Übersetzungstabelle erstellt hatte, von denen viele nicht mehr benötigt wurden oder vom Code referenziert wurden. Bei etwa 180 abhängigen Codedateien war es unmöglich, jede einzelne Ressourcenzeichenfolge manuell durchzugehen.

Der folgende Code (in vb.net) geht durch Ihr Projekt und findet verwaiste Ressourcen (in der Projektressourcen und nicht die Ressourcen der einzelnen Formulare ). Für mein Projekt benötigte ich etwa 1 Minute. Es kann geändert werden, um Strings, Bilder oder jeden anderen Ressourcentyp zu finden.

Zusammengefasst;

  • 1) Verwendet die Projektdatei der Lösung, um den gesamten enthaltenen Code zu sammeln Module zu sammeln und sie an eine einzige String-Variable anzuhängen;
  • 2) Führt eine Schleife durch alle Projektressourcenobjekte und erstellt eine Liste (in meinem Fall) derjenigen, die Strings sind;
  • 3) Führt eine Stringsuche durch, um Ressourcenstringcodes in der kombinierten Projekttextvariable zu finden;
  • 4) Meldet Ressourcenobjekte, die nicht referenziert sind.

Die Funktion gibt die Objektnamen in der Windows-Zwischenablage zum Einfügen in eine Tabelle oder als Listenarray mit den Ressourcennamen zurück.

edit : Beispielaufruf im Modul : 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

3voto

Anatoliy Punkte 652

Ich verwende ReSharper, um ungenutzte Ressourcenfelder zu finden und sie dann manuell zu entfernen, wenn das Projekt nur eine kleine Menge an Ressourcen enthält. Einige kurze Skript kann verwendet werden, wenn wir bereits Liste der ungenutzten Elemente haben.

Die Lösung ist die nächste:

  • alle nicht verwendeten Mitglieder anzeigen, wie in dieser Artikel
  • temporäres Entfernen von *.Designer.cs aus den generierten Dateimasken (ReSharper Optionen CodeInspection GeneratedCode)
  • Kommentieren oder entfernen Sie auch den Kommentar (der angibt, dass der Code automatisch generiert wird) am Anfang der Datei Designer.cs, die an die Ressourcendatei angehängt ist.

Sie erhalten eine Liste aller nicht verwendeten Ressourcen, die Sie aus resx entfernen können.

1voto

Chris Simpson Punkte 7571

Ich habe selbst darüber nachgedacht, und ich glaube, ich habe zwei Möglichkeiten. Beide beruhen auf der Tatsache, dass ich eine Hilfsmethode verwende, um die erforderliche Ressource aus den Ressourcendateien zu extrahieren.

  1. Protokollierung
    Fügen Sie der oder den "getresource"-Methode(n) einen Code hinzu, damit bei jedem Zugriff auf eine Ressource der Ressourcenschlüssel in ein Protokoll geschrieben wird. Versuchen Sie dann, auf jeden Teil der Website zuzugreifen (ein Testskript könnte hier hilfreich sein). Die daraus resultierenden Protokolleinträge sollten eine Liste aller aktiven Ressourcenschlüssel enthalten, der Rest kann weggeworfen werden.

  2. Code-Analyse
    Ich prüfe, ob T4 ist in der Lage, die Lösung durchzuarbeiten und eine Liste aller Verweise auf die Hilfsmethode "getresource" zu erstellen. Die daraus resultierende Liste der Schlüssel ist aktiv, der Rest kann gelöscht werden.

Bei beiden Methoden gibt es Einschränkungen. Die Protokollierungsmethode ist nur so gut wie der vom Test abgedeckte Code, und die Codeanalyse findet möglicherweise nicht immer die Schlüssel, sondern eher die Zeichenketten, die die Schlüssel enthalten.

Ich denke, ich werde beides ausprobieren. Ich werde Sie wissen lassen, wie es läuft.

1voto

DevHead Punkte 21

Benennen Sie Ihr aktuelles Bildverzeichnis um und erstellen Sie dann ein neues, suchen Sie in VS nach Ihrem Bildpfad, z. B. "/content/images", wählen Sie alle verwendeten Bilder aus und ziehen Sie sie in den neuen Bildordner. Sie können dann das alte Verzeichnis aus dem Projekt ausschließen oder es einfach löschen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X