如何查找可能已成爲「孤立」且不再需要的.resx文件中未使用的圖標,圖像,字符串?在.NET解決方案中查找未使用的資源
回答
這是算法無法可靠計算的信息。被檢查的程序可以獲取所有資源的列表並且對它們做一些事情,比如讓用戶從多個圖標中選擇。
您最好的選擇可能是搜索到您選擇的資源訪問API的所有引用和手工檢查這些。使用grep
/sed
您可以通過處理使用簡單字符串的所有「簡單」工具手動減少需要手動檢查的網站。
我一直在考慮這個,我相信我有兩個選擇。這兩種方法都依賴於我使用輔助方法從資源文件中提取所需資源的事實。
記錄
添加一些代碼來了「的getResource」一種或多種方法使每一個資源被訪問時,資源鍵被寫入日誌。然後嘗試訪問網站的每個部分(測試腳本在這裏可能會有所幫助)。生成的日誌條目應該提供所有活動資源鍵的列表,其餘可以被廢棄。代碼分析
我在看T4是否能夠通過解決工作和創造的所有引用的列表中「的getResource」輔助方法。結果鍵的列表將被激活,其餘的可以被刪除。
這兩種方法都有侷限性。日誌記錄方法只與測試覆蓋的代碼一樣好,代碼分析可能並不總是找到鍵而不是包含鍵的字符串,因此在那裏需要一些額外的手動工作。
我想我會嘗試兩個。我會讓你知道它是怎麼回事。
重命名您當前的圖片目錄,然後創建一個新的圖片,在VS中爲您的圖片路徑(例如'/ content/images')做一個find-in-files搜索,多選所有使用過的圖片並拖入新圖片圖像文件夾。 然後,您可以從項目中排除舊的目錄,或者將其刪除。
我創建了一個免費的開源VS擴展,它會在一個項目中未使用的圖像,剛發佈的第一個版本:https://github.com/jitbit/vs-unused-image-finder
因爲我無法找到一個簡單和快速的解決方案還沒有,我發現至少有一個解決方案可以讓我得到我期待的結果,即使需要一些時間(對於懶惰的週日下午來說也是理想的)。
的解決方案涉及的Visual Studio .NET 2010和ReSharper的(我使用的是7.1版),並進入類似下面。
步驟一步的解決方案
1)在VS.右鍵單擊主RESX文件NET,然後從上下文菜單中選擇「查找用法」:
這將帶來ReSharper的「查找結果」窗口。
2)雙擊解窗口每次出現:
這將打開源代碼窗口與資源。
3)從源代碼窗口中重命名此資源:
它會彈出ReSharper的 「重命名資源」 對話框。
4.)給該資源一個新名稱,其中包含唯一前綴。在我的例子,這是「TaskDialog_」:
將重命名這兩個資源,並自動生成的C#包裝/門禁類。
5.)對「使用情況」窗口中的所有資源重複上述步驟2,3和4。
6)打開在Visual Studio的資源編輯器的RESX文件,然後選擇所有文件,而沒有前綴:
7)現在點擊「刪除資源」按鈕窗口的頂部或直接按德爾鍵:
你終於有一個RESX文件,只有在你的文件中使用過的資源。
8.)(可選)如果您有多種語言的資源(例如德語爲「Resources.de.resx」),請對這些RESX文件重複步驟7和8。
警告
請注意,如果您訪問比通過強類型,自動生成C#類Resources
等你的字符串這是不行的。
我有一個類似的問題。我爲轉換表創建了幾千個資源字符串,其中很多資源字符串已不再需要或由代碼引用。大約有180個依賴代碼文件,我不會手動通過每個資源字符串。
以下代碼(在vb。淨額)將通過你的項目找到孤兒資源(在項目資源,而不是任何個人表格的資源)。我的項目花了大約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
謝謝,希望您不介意我添加一兩個額外的音符。我們有一個需要調查的幾千個資源字符串的表單,所以這個過程非常有用。原來,表單的Localizable屬性爲True,因此所有控件都將設置存儲在表單的resx中。設置爲false將事情切換回正常,並將resz的大小從600 + k縮小到35k! – 2015-07-02 15:18:36
我最近建立了一個工具,可以檢測和刪除未使用的字符串資源。我用這篇文章中的信息作爲參考。這個工具可能並不完美,但它可以完成繁重的工作,如果您有一個歷史悠久的大項目,它將非常有用。我們內部使用這個工具來整合資源文件,並刪除未使用的資源(我們擺脫了10000個以上的4000多個資源)。
你可以看一下源代碼,或者從這裏安裝的ClickOnce:https://resxutils.codeplex.com/
這看起來很有希望(一旦我發現你必須刪除Resources.Designer.cs才能顯示任何結果)。但是它無法在XAML文件中找到引用,這是一個不容忽視的問題。 – RandomEngy 2014-09-06 16:13:53
我用ReSharper的查找未使用的資源字段,然後手動刪除他們,如果項目包含資源的量小。如果我們已經有未使用的項目列表,可以使用一些簡短的腳本。
的解決方案是下一個:
- 顯示所有未使用的成員從生成的文件掩碼 本文 http://chrisseroka.wordpress.com/2013/10/28/find-unused-private-and-public-methods-with-resharper/
- 臨時刪除*了.Designer.cs中描述(ReSharper->選項 - > CodeInspection- > GeneratedCode)
- 還從附加到資源文件的Designer.cs文件的頂部註釋或刪除註釋(表示代碼是自動生成的 )。
您將擁有所有未使用資源的列表,將其從resx中刪除。
最近ResXManager 1.0.0.41添加了一項功能來顯示字符串資源的引用數量。
- 1. 集中解決方案的資源
- 2. 尋找.Net解決方案的免費授權解決方案
- 3. 解決方案未顯示在團隊資源管理器中
- 4. VS 2008解決方案資源管理器中不顯示的解決方案
- 5. 在解決方案中查找文件
- 6. 資源注入和解決方案
- 7. 開源.Net POS解決方案
- 8. 在解決方案資源管理器中查找多個文件
- 9. 從.net解決方案中刪除未使用的DLL
- 10. 在解決方案資源管理器中未更新的引用
- 11. 尋找基於Microsoft .NET的開源內聯網解決方案
- 12. 解決方案資源管理器的「跟蹤解決方案資源管理器中的活動項目」等效於「解決方案導航器」
- 13. VS2012/2013未能顯示解決方案資源管理器
- 14. Visual Studio解決方案資源管理器未加載文件
- 15. 在解決方案資源管理器中找到reSharper快捷方式
- 16. 解決方案資源管理與解決方案導航VS類視圖
- 17. 如何使用DataAnnotations ErrorMessageResourceName與自定義資源解決方案
- 18. WPF錯誤 - 在哪裏查找源代碼/解決方案
- 19. 我無法在visual studio中找到我的解決方案資源管理器
- 20. SoapClient未找到替代解決方案
- 21. NET服務解決方案
- 22. 查找文件查找文件不在解決方案中
- 23. 插件在可用時用「打開相應的解決方案」擴展解決方案資源管理器?
- 24. 如何在解決方案資源管理器中顯示RouteConfig?
- 25. 在解決方案資源管理器中缺少SilverLight項目
- 26. 在解決方案資源管理器中顯示庫文件
- 27. 在解決方案資源管理器中創建子項目
- 28. 在.NET中使用TWAIN - 尋找資源
- 29. 解決方案文件夾未在Windows資源管理器中顯示
- 30. 實體框架在解決方案資源管理器中未顯示
問題不在於目錄中的物理圖像,而在於resx文件中的資源。 – 2012-02-20 14:15:05