¿Cómo se puede encontrar iconos, imágenes y cadenas no utilizados en archivos .resx que pueden haber quedado huérfanos y que ya no son necesarios?Buscar recursos no utilizados en una solución .NET
Respuesta
Esto no es información que un algoritmo pueda calcular de manera confiable. El programa inspeccionado podría obtener una lista de todos los recursos y hacer algo con ellos, como dejar que el usuario elija entre varios iconos.
Su mejor opción es, probablemente, buscar todas las referencias a su API de acceso a recursos e inspeccionarlas manualmente. Con grep
/sed
, puede reducir los sitios que tiene que inspeccionar manualmente al manejar todos los "fáciles" donde se usa una cadena simple.
He estado considerando esto yo mismo y creo que tengo dos opciones. Ambos se basan en el hecho de que utilizo un método auxiliar para extraer el recurso requerido de los archivos de recursos.
registro
añadir algo de código para el método "getResource" o métodos de modo que cada vez que se accede a un recurso, el recurso clave se escribe en un registro. Luego intente acceder a cada parte del sitio (un script de prueba podría ser útil aquí). Las entradas de registro resultantes deberían proporcionar una lista de todas las claves de recurso activas, el resto puede eliminarse.análisis de código
estoy mirando si T4 es capaz de trabajar a través de la solución y la creación de una lista de todas las referencias al método de ayuda "getResource". La lista resultante de claves estará activa, el resto se puede eliminar.
Existen limitaciones de ambos métodos. El método de registro es tan bueno como el código cubierto por la prueba y el análisis del código puede no encontrar siempre las claves en lugar de las cadenas que contienen las claves, por lo que se requerirá algún trabajo manual adicional.
Creo que voy a probar ambos. Te dejaré saber cómo va.
Cambie el nombre de su directorio de imagen actual y cree uno nuevo, realice una búsqueda de hallazgos dentro de VS para su ruta de imagen, es decir, '/ content/images', seleccione todas las imágenes usadas y arrástrelas al nuevo carpeta de imágenes. Puede excluir el directorio anterior del proyecto o simplemente eliminarlo.
he creado un código abierto libre de estomatitis vesicular extensión que busca las imágenes no utilizadas en un proyecto, acabo de publicar la primera versión: https://github.com/jitbit/vs-unused-image-finder
ya que no pude encontrar una solución rápidasencilla y todavía, Encontré al menos una solución que me permite obtener el resultado que estoy buscando, incluso si lleva algo de tiempo (ideal para una tarde de domingo flojo).
La solución incluye Visual Studio .NET 2010 y ReSharper (estoy usando la versión 7.1) y es como la siguiente.
paso a paso de la solución
1.) Haga clic con el resx primaria en VS.NET y seleccione "Usos" en el menú contextual:
Con ello se abre "Buscar Resultados de" ventana de ReSharper. Haga doble clic en cada caso en la ventana de solución
2.):
Esto abrirá la ventana de código fuente con el recurso.
3.) Cambiar nombre de este recurso desde el interior de la ventana de código fuente:
Se abrirá el diálogo "Cambiar el nombre de recurso" de ReSharper.
4.) Proporcione al recurso un nuevo nombre con un prefijo único . En mi ejemplo, esto es "TaskDialog_":
cambiará el nombre tanto del recurso y también el C# clase contenedora/acceso generada automáticamente.
5.) Repita los pasos 2, 3 y 4 anteriores para todos los recursos en la ventana "Usos".
6.) Abrir el archivo en RESX editor de recursos de Visual Studio y seleccionar todos los archivos sin el prefijo:
7.) Ahora haga clic en el botón "Eliminar de recursos" en la la parte superior de la ventana o simplemente pulse la tecla dedel:
Finalmente tiene un archivo RESX con solo los recursos utilizados en su archivo.
8.) (opcionalmente) Si tiene recursos en varios idiomas (por ejemplo, "Resources.de.resx" para el alemán), repita los pasos 7 y 8 para esos archivos RESX, también.
Advertencia
Tenga en cuenta que esto no funcionará si tiene acceso a las cadenas que no sean a través del establecimiento inflexible, clase C# generada automáticamente Resources
.
Tuve un problema similar. Varias miles de cadenas de recursos que había creado para una tabla de traducción, muchas de las cuales ya no eran necesarias o referencia por código. Con alrededor de 180 archivos de código dependientes, no había forma de que fuera a examinar manualmente cada cadena de recursos.
El siguiente código (en vb.net) irá a través de su proyecto buscando recursos huérfanos (en los recursos del proyecto , no en los recursos de formularios individuales). Me tomó alrededor de 1 minuto para mi proyecto. Se puede modificar para buscar cadenas, imágenes o cualquier otro tipo de recurso.
En resumen;
- 1) utiliza el archivo de proyecto de solución para reunir todos los códigos módulos incluidos y los añade en una sola variable de cadena;
- 2) Pasa por todos los objetos de recursos del proyecto y crea una lista (en mi caso) de los que son cadenas;
- 3) Hace una búsqueda de cadena encontrar los códigos de cadena de recursos en la variable de texto de proyecto combinada;
- 4) Informa los objetos de recursos a los que no se hace referencia.
La función devuelve los nombres de los objetos en el portapapeles de Windows para pegarlos en una hoja de cálculo o como una matriz de lista de los nombres de los recursos.
edición: Ejemplo de llamada en el módulo: 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
Gracias, espero que no le importe agregar una nota extra o dos. Teníamos un formulario con un par de miles de recursos que necesitábamos investigar, así que esto fue útil en el camino. Resultó que el formulario tenía su propiedad Localizable True, por lo que todos los controles tenían configuraciones almacenadas en el resx del formulario. Poniendo a false las cosas conmutadas a normal y reduciendo el tamaño de resz de 600 + k a 35k! –
recientemente he construido una herramienta que detecta y elimina los recursos de cadena no utilizados. Usé la información en esta publicación como referencia. Es posible que la herramienta no sea perfecta, pero cumple con la parte de levantamiento de objetos pesados y será útil si tiene un proyecto grande con una larga historia. Utilizamos esta herramienta internamente para consolidar archivos de recursos y eliminar recursos no utilizados (eliminamos más de 4.000 recursos de 10.000).
se puede ver en el código fuente, o simplemente instalar ClickOnce desde aquí: https://resxutils.codeplex.com/
Esto parecía prometedor (una vez que descubrí que tenía que eliminar Resources.Designer.cs para que mostrara los resultados). Pero no pudo encontrar referencias en los archivos XAML, que es un obstáculo. – RandomEngy
uso ReSharper para encontrar campos de recursos no utilizados y luego eliminarlos manualmente si el proyecto contiene una pequeña cantidad de recursos. Algunos guiones cortos se pueden usar si ya tenemos una lista de elementos no utilizados.
La solución está al lado:
- muestran todos los miembros no utilizados tal como se describe en este artículo http://chrisseroka.wordpress.com/2013/10/28/find-unused-private-and-public-methods-with-resharper/
- retirando temporalmente * .Designer.cs de máscaras de los archivos generados (ReSharper-> Opciones-> CodeInspection- > GeneratedCode)
- También comente o elimine el comentario (que indica que el código es auto generado) desde la parte superior del archivo Designer.cs adjunto al archivo de recursos.
Tendrá una lista de todos los recursos no utilizados, a la izquierda para eliminarlos de resx.
Recientemente, ResXManager 1.0.0.41 agregó una función para mostrar el número de referencias a un recurso de cadena.
no pude encontrar ninguna solución existente que buscar referencias de recursos de cadena en archivos XAML y lotes eliminar las no utilizadas.
Así que escribió esto: https://github.com/Microsoft/RESX-Unused-Finder
Se busca en un directorio del proyecto para las referencias a recursos de cadena, a continuación, muestra una lista de los que no pudo encontrar un partido para. Puede especificar una plantilla para buscar para que pueda encontrar referencias en archivos XAML.
+1. Daría más si fuera posible. Estaba buscando una gran herramienta desde hace un tiempo y esta se destaca por mí! Gran trabajo ! – DeMama
Esta herramienta es excelente, especialmente si usa WPF. Generamos clases que proxy para AppResources y esta herramienta lo maneja perfectamente. Usamos extensiones de marcado XAML personalizadas y funciona con eso también. Muy bien hecho. – Skrymsli
- 1. Buscar css no utilizados
- 2. Eliminar cs-files no utilizados en la solución
- 3. ¿Cómo liberar los recursos utilizados por HttpPostedFileBase?
- 4. NHibernate 1.2 en una solución .NET 4.0
- 5. Recolector de elementos no utilizados .NET y memoria virtual x64
- 6. ¿Patrones de diseño utilizados en .NET Framework?
- 7. Argumentos no utilizados en R
- 8. Buscar todos los estilos CSS utilizados en el sitio web
- 9. ¿Cómo puedo clonar una solución .NET?
- 10. Eliminación de recursos en .NET
- 11. .NET Reflection: Encuentra los tipos utilizados
- 12. Buscar clases no utilizadas en un proyecto .net
- 13. ¿Puedes mezclar versiones de .NET framework en una solución?
- 14. Eliminación de factores no utilizados de una faceta en ggplot2
- 15. ¿Quitar selectores no utilizados en una hoja de estilo CSS?
- 16. asp.net eliminar httpmodules no utilizados
- 17. usando recursos .NET sin construir
- 18. ¿Hay algún método para limpiar el sitio web de recursos no utilizados
- 19. definiendo parámetros no utilizados en C
- 20. Recursos globales en una biblioteca de clases
- 21. Identificación de clases/controles/páginas no utilizados
- 22. Buscar elementos no ssl en una página https
- 23. .NET Minimizar en la bandeja Y Minimizar los recursos necesarios
- 24. NSIS: Buscar y descargar la versión .Net
- 25. ¿Existe una solución de Integración Continua prefabricada para aplicaciones .NET?
- 26. Buscar todos los recursos incrustados en otro conjunto
- 27. Cómo encontrar atributos/métodos no utilizados en Visual C++ 2008
- 28. Cómo usar los archivos de recursos .net en javascript
- 29. Buscando una solución de licencia gratuita para .Net soluciones
- 30. ¿Hay alguna manera fácil de encontrar referencias de ensamblados no utilizados en mi proyecto .NET?
La pregunta no es sobre imágenes físicas en directorios, sino recursos en archivos resx. –