60

「孤立」して不要になった可能性のある .resx ファイル内の未使用のアイコン、画像、文字列をどのように見つけますか?

4

10 に答える 10

51

最近、 ResXManager 1.0.0.41に、文字列リソースへの参照数を表示する機能が追加されました。

新しい参照列を示すスクリーンショット

于 2014-09-04T13:12:17.753 に答える
20

XAML ファイル内の文字列リソース参照を検索し、未使用のものを一括削除する既存のソリューションは見つかりませんでした。

だから私はこれを書きました: https://github.com/Microsoft/RESX-Unused-Finder

RESX 未使用のファインダーのスクリーンショット

プロジェクト ディレクトリで文字列リソースへの参照を検索し、一致するものが見つからなかったもののリストを表示します。XAML ファイル内の参照を見つけることができるように、検索するテンプレートを指定できます。

于 2014-10-27T23:41:15.147 に答える
11

プロジェクトで未使用の画像を検索する無料のオープンソースVS拡張機能を作成し、最初のバージョンを公開しました:https ://marketplace.visualstudio.com/items?itemName=Jitbit1.VSUnusedImagesFinder

于 2012-03-23T07:40:25.727 に答える
8

これは、アルゴリズムが確実に計算できる情報ではありません。検査されたプログラムは、すべてのリソースのリストを取得し、ユーザーにいくつかのアイコンから選択させるなど、それらを使用して何かを行うことができます。

おそらく最善の策は、選択したリソース アクセス API へのすべての参照を検索し、それらを手動で検査することです。grep/を使用sedすると、単純な文字列が使用されているすべての「簡単な」サイトを処理することで、手動で検査する必要があるサイトを減らすことができる場合があります。

于 2008-10-29T07:13:39.513 に答える
7

シンプル迅速な解決策をまだ見つけることができなかったので、少なくとも時間がかかっても探している結果を得ることができる解決策を見つけました (怠惰な日曜日の午後に最適です)。

このソリューションには、Visual Studio .NET 2010 と ReSharper (私はバージョン 7.1 を使用しています) が含まれており、次のようになります。

ステップバイステップのソリューション

1.) VS.NET でプライマリ RESX ファイルを右クリックし、コンテキスト メニューから [使用箇所の検索] を選択します。

ここに画像の説明を入力

これにより、ReSharper の「検索結果」ウィンドウが表示されます。

2.)ソリューション ウィンドウで各出現箇所をダブルクリックします。

ここに画像の説明を入力

これにより、リソースを含むソース コード ウィンドウが開きます。

3.)ソース コード ウィンドウ内からこのリソースの名前を変更します。

ここに画像の説明を入力

ReSharper の「Rename Resource」ダイアログが表示されます。

4.)リソースに一意の接頭辞を付けた新しい名前を付けます。私の例では、これは「TaskDialog_」です。

ここに画像の説明を入力

リソースと自動生成された C# ラッパー/アクセス クラスの両方の名前が変更されます。

5.) [使用状況] ウィンドウで、すべてのリソースに対して上記の手順 2、3、および 4 を繰り返します。

6.) Visual Studio のリソース エディターで RESX ファイルを開き、プレフィックスのないすべてのファイルを選択します。

ここに画像の説明を入力

7.)ウィンドウの上部にある [リソースの削除] ボタンをクリックするか、次のDelキーを押します。

ここに画像の説明を入力

最終的に、ファイル内で実際に使用されたリソースのみを含む RESX ファイルが作成されます。

8.) (オプション) 複数の言語のリソースがある場合 (たとえば、ドイツ語の場合は「Resources.de.resx」)、それらの RESX ファイルについても手順 7 と 8 を繰り返します。

警告

厳密に型指定され、自動生成された C# クラス以外を介して文字列にアクセスする場合、これは機能しないことに注意してくださいResources

于 2012-12-09T10:03:40.323 に答える
6

私は最近、未使用の文字列リソースを検出して削除するツールを作成しました。この記事の情報を参考にしました。このツールは完璧ではないかもしれませんが、手間のかかる部分を処理してくれるので、長い歴史を持つ大きなプロジェクトの場合に役立ちます。このツールを社内で使用してリソース ファイルを統合し、未使用のリソースを削除しました (10,000 のうち 4,000 以上のリソースを削除しました)。

ソース コードを確認するか、ここから ClickOnce をインストールするだけです: https://resxutils.codeplex.com/

于 2013-10-28T19:19:35.940 に答える
3

同様の問題がありました。変換テーブル用に作成した数千のリソース文字列。その多くは不要になり、コードで参照されなくなりました。約 180 の依存コード ファイルがあるため、各リソース文字列を手動で確認する方法はありませんでした。

次のコード (vb.net 内) は、孤立したリソース(個々のフォームのリソースではなく、プロジェクトのリソース内) を見つけるプロジェクトを通過します。私のプロジェクトでは約1分かかりました。文字列、画像、またはその他のリソース タイプを検索するように変更できます。

要約すると、

  • 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
于 2013-02-13T22:36:43.623 に答える
1

現在の画像ディレクトリの名前を変更してから新しい画像ディレクトリを作成し、VS内で画像パス(「/ content / images」)を検索してファイル内検索を実行し、使用されているすべての画像を複数選択して、新しい画像フォルダにドラッグします。その後、古いディレクトリをプロジェクトから除外するか、単に削除することができます。

于 2011-02-03T22:48:00.917 に答える
1

私はこれを自分で検討してきましたが、2つの選択肢があると思います。どちらも、ヘルパー メソッドを使用してリソース ファイルから必要なリソースを抽出するという事実に依存しています。

  1. ロギング
    「getresource」メソッドにコードを追加して、リソースにアクセスするたびにリソース キーがログに書き込まれるようにします。次に、サイトのすべての部分にアクセスしてみます (ここではテスト スクリプトが役立つ場合があります)。結果のログ エントリには、すべてのアクティブなリソース キーのリストが表示されます。残りは破棄できます。

  2. コード分​​析
    私は、T4がソリューションを処理し、"getresource" ヘルパー メソッドへのすべての参照のリストを作成できるかどうかを調べています。結果のキーのリストがアクティブになり、残りは削除できます。

どちらの方法にも制限があります。ロギング方法は、テストでカバーされたコードと同じくらい良いものであり、コード分析では、キーを含む文字列ではなくキーが常に見つかるとは限らないため、追加の手動作業が必要になります。

両方試してみようと思います。その様子をお伝えします。

于 2009-06-30T19:01:29.310 に答える