2009-09-30 33 views
14

私は非常に大きなプロジェクト(16個のプロジェクトを含み、各プロジェクトに約100個のファイルが含まれているソリューション)を扱っています。プロジェクトから不要なリソースを削除するにはどうすればよいですか?

Visual Studio 2005を使用してC++/C#で書かれています。
プロジェクトの1つには約2,000のリソースがあり、うち400個しか実際には使用されていません。
これらの未使用リソースを削除するにはどうすればよいですか?

私は、使用したものを検索してその作業を実行しようとしました。
これはうまくいって解決策を構築できましたが、実行時に破損しました。

enumが使用されていると思います。 (重要

は、どのように私はそれが実行時に壊れていないことを確認することができますか?

EDIT:
私は1つの方法は、(何らかの形で)実行時にその場でリソース(それが見つからない)を生成することができると思います。
しかし、私は考えていない... 何か

注:不要なリソースがまだ残っていても問題ありません。

+1

resxファイルのクリーンアップを意味する場合、SharpDevelopにはこのような機能があります。 (http://www.sharpdevelop.net) –

+0

C++で動作しますか? –

+0

1600個のソースファイルが "非常に大きい"システムを呼び出すことはありません。中程度、おそらく、 "非常に大きい"ではありません。別のゼロを追加すると、「非常に大きい」に近づいています。 – JesperE

答えて

4

ソースコードを検索するためのカスタムツールを作成します。

ヘッダーファイルからリソースIDを削除した場合(つまりresource.hと呼ばれることもある)、再コンパイルして警告を受け取らない場合、それは良いことです。

ここで私はアプリを書く方法について説明します。あなたが精査したいリソースファイル(resource.h)を入力します。ヘッダーファイル(* .h)を開き、すべてのリソース定数(または少なくともあなたが興味のあるもの)を解析します。後ですばやく検索できるように、それらをハッシュテーブルに格納します。 プロジェクトのコードファイルごとに、各リソースIDのインスタンスをテキストで検索します。リソースIDが使用されている場合は、ハッシュテーブル内の値をインクリメントし、それ以外の場合はゼロにします。 最後に、ログファイルなどのゼロのリソースIDをすべてダンプします。実際に指定されたリソースIDを安全に削除できることをテストします。一度それをしたら、ログファイルの結果が与えられた指定されたリソースIDを削除する別のツールを書いてください。

あなたはperlでこのようなツールを書くことができ、それは約0.3秒で実行されます:しかし、デバッグには数日かかるでしょう。 :) またはこれを書くことができます。NETを実行すると少し遅く実行されますが、デバッグには1時間かかります。 :)

+1

非常にクールな:-) + 1A –

0

おそらくFind Unused Resources in a .NET Solutionがここに役立ちますか?基本的には、どのリソースが使用されているか(包括的なコードカバレッジチェックなど)を確認し、未使用のものを削除する必要があります。

恐らく、トレイルとエラーのアプローチを使用してクリーンアップすることを恐れてはいけません。

+0

私はこれだけでした。しかし:( –

1

Visual Studio用のサードパーティ製プラグインをReSharperとして使用できます。このアドインは、C#コードを分析し、未使用のリソースを指摘します。しかし、それはC#でのみ動作します。

1

C++プロジェクトの場合、RiverbladeのResOrgを参照してください。

「リソースIDオーガナイザー(ResOrgショート用)アドインのVisual Cのためである++のWindowsアプリケーションを維持/発展の最も迷惑な(と不要)雑用の1を克服するために設計された - リソースシンボルID値を維持すること」

ソリューションエクスプローラ

http://www.riverblade.co.uk/products/resorg/index.html

0

、右クリックして、リファレンス上のメニュー項目をクリックし依存コードを探します。

依存コードが見つからない場合は、この参照をプロジェクトから削除できます。 (を削除する操作は、右クリックメニューの下にもあります。)

EDIT:大規模なプロジェクトのために、検索依存コード操作が長い時間がかかります。あなたが2000のリソースと最も可能性の高いこれはおそらくない現実的な選択肢であるあなたの時間を持っているので....

1

だから、私は1つの悪いものを持っていたことがありません。コンパイルされたプログラムの私の方法は、GREPをエミュレートするREXXスクリプトを使用して、使用されていないと思われるソースへの参照を探し、プログラムから削除し、何が壊れているかを確認することです。私は検索したいファイルのリストをあらかじめフィルターに掛けることができるので、REXXスクリプトを使用します。これにより、フォルダやコンピュータ間で検索を行うことができます。

1

ツールReflector(無料)をご覧になり、ReSharper(高価)と混同しないでください。どのDLLが別のDLLに依存しているかを示すことができます。次に、あなたが望むなら、何か他のものによって参照されていないDLLを削除することができます。依存関係注入やリフレクションを使用している場合は、あなたの知識なしにコードを壊す可能性があることに注意してください。

反射器: http://www.red-gate.com/products/reflector/

このアドインは、アセンブリ依存グラフとILグラフを描画します。 http://reflectoraddins.codeplex.com/Wiki/View.aspx?title=Graph

+1

リフレクターはもうビールではありません。 – Bobby

1

コードに実行時にリソースを動的にロードする(たとえば文字列を使用する)場合、ソースから安全に削除できるリソースを自動的に判断する方法はありません。動的ロードステートメントは、任意のリソースをロードできます。

あなたの最善の策は、あなたのトリミングされたバージョンのアプリケーションから起動し、それを実行し、テストするときに欠落しているリソースを特定することです。その後、それらを追加して再テストします。

0

C++リソースの場合は、「リソースビュー」でプロジェクトを右クリックし、隣に目盛りのないものを削除しようとしましたか?未使用のダイアログリソースは、コード内で「enum」として参照されているため、削除するのは安全ではありません(次のように)。

enum { IDD = IDD_ABOUTBOX }; 

..それ以外はすべて安全です。

1

ソリューションエクスプローラの[リソースビュー]で、右クリックして[リソースシンボル]を選択します。 .RCファイルでどのリソース定数が使用されているかを確認できるリストが表示されます。これは、Resource.hをクリーンアップするための方法では少し役立つかもしれません(実際のC++コードでは使用されていないリソースは表示されませんが)。

関連する問題