3

他のパブリック メソッドから直接または間接的に呼び出されないすべてのプライベート メソッドを見つける必要がある C# プロジェクトがあります。

さらに、パブリック メソッドから呼び出されるプライベート メソッドごとに、それがどのパブリック メソッドであるかを知る必要があります。次に、そのメソッドがクラスのクライアントから本当に呼び出されているかどうかを判断し、そうでない場合は削除できます。

以前は、Reflector のベースである Lutz Rorder のコードを使用していました。これには、IL コードを分析するオプションがあり、その上にオブジェクト モデルがありました。私は今このコードを見つけることができません。

なにか提案を?多分そのルッツ・ローダーコードへのポイントですか?

ザール

4

6 に答える 6

3

Thomas が指摘したように、ツールNDependは、.NET コード ベースで未使用のコードを見つけるのに役立ちます。免責事項: 私はこのツールの開発者の 1 人です。

NDepend は、LINQ Query (CQLinq) で Code Ruleを作成することを提案しています。約200 の既定のコード規則が提案されており、そのうちの 3 つは未使用/デッド コードの検出専用です。

NDepend は Visual Studio に統合されているため、これらのルールは IDE 内で直接チェック/参照/編集できます。このツールは CI プロセスに統合することもでき、違反したルールやコード要素の原因を示すレポートを作成できます。

上記の 3 つのリンクをクリックしてこれらのルールのソース コードに移動すると、型とメソッドに関するものが少し複雑であることがわかります。これは、未使用の型とメソッドだけでなく、未使用のデッド型とメソッド (再帰的) によってのみ使用される型とメソッドも検出するためです。

これはstatic analysisであるため、ルール名に接頭辞Potentiallyが含まれています。コード要素がリフレクションによってのみ使用される場合、これらのルールはそれを未使用と見なす可能性がありますが、そうではありません。

これら 3 つのルールを使用することに加えて、テストによってコード カバレッジを測定し、完全なカバレッジを達成するよう努めることをお勧めします。多くの場合、テストでカバーできないコードは、実際には安全に破棄できる未使用/デッドコードであることがわかります。これは、コードの分岐が到達可能かどうかが明確でない複雑なアルゴリズムで特に役立ちます。


さらに、パブリック メソッドから呼び出されるプライベート メソッドごとに、それがどのパブリック メソッドであるかを知る必要があります。

この情報を取得するには、CQLinq を使用して次のように記述するだけです。

from m in Application.Methods
where m.IsPrivate
let publicMethodsCallingMe = m.MethodsCallingMe.Where(m1 => m1.IsPublic)
where publicMethodsCallingMe.Count() > 0
select new { m, publicMethodsCallingMe }

クエリの結果は簡単に閲覧できます。

CQLinq クエリ結果の参照

于 2010-09-01T14:35:05.683 に答える
3

Nitriq Static Code Analysis for .Netを確認してください。無料のコミュニティ版があり、本格的なライセンスはかなり妥当です。

于 2010-04-18T20:55:49.007 に答える
2

まあ、これを行う唯一の方法(少なくとも私が知っている唯一の方法...)は、商用の(しかしそれほど高価ではない)ツール、つまりNDependを使用することを意味します。

とりわけ、コンパイル済みのアセンブリに対して SQL に似たクエリを記述できるため、非常にきめ細かい分析が可能になります。彼らはそれを CQL と呼び、構文は自明であり、NDepend の IntelliSense/オートコンプリート サポートと一般的なヘルプ/ドキュメントは非常に優れています。

(知る限り、フル機能の試用版も提供されています。それが役立つ場合は...)

チッ!

于 2009-11-04T07:52:37.697 に答える
1

これらすべてのニーズを満たすかどうかはわかりませんが、FXCop はこれらのほとんどを実行し、多くのコーディング標準を実行するのにも役立ちます. どちらの方法でも、C# コードを実行する価値があります。

FXコップ (MSDN)

于 2009-11-04T07:40:11.643 に答える
0

PowerCommands for Reflector アドイン ( http://powercommands.codeplex.com )のクエリ エディターを使用して、これについてお手伝いできるかもしれません。明日。

それ以外の場合は、CCI または Cecil を使用して簡単なアプリケーションを作成することもできます。

クエリ:

from a in AssemblyManager.Assemblies.Cast<IAssembly>()
where a.Name != "mscorlib" 
    && !a.Name.Contains("System")
from m in a.Modules.Cast<IModule>()
from t in m.Types.Cast<ITypeDeclaration>()
from mt in t.Methods.Cast<IMethodDeclaration>()
where mt.Visibility == MethodVisibility.Public 
    && !mt.RuntimeSpecialName 
    && !mt.SpecialName 
    && mt.Body is IMethodBody
from i in ((IMethodBody)mt.Body).Instructions.Cast<IInstruction>()
where i != null 
    && i.Value != null 
    && i.Value is IMethodReference 
    && ((IMethodReference)i.Value).Resolve() != null
    && ((IMethodReference)i.Value).Resolve().Visibility == MethodVisibility.Private
select new { 
    CallingMethod=t.Namespace + "." + t.Name + "." + mt.Name, 
    PrivateReferencedMethod=((ITypeReference)((IMemberReference)((IMethodReference)i.Value).Resolve()).DeclaringType).Namespace + "."
        + ((ITypeReference)((IMemberReference)((IMethodReference)i.Value).Resolve()).DeclaringType).Name + "."
        + ((IMethodReference)i.Value).ToString()
}
于 2009-11-04T22:05:58.470 に答える
0

Reflector にはまだこの機能があります。メソッドを右クリックし、[分析] をクリックします。ツリー ビューのリンクをたどります。

コードで行う必要があるのか​​、単に「視覚的に」行う必要があるのか​​はわかりません。

コードが必要な場合は、Reflector SDK を使用できると確信しています。

于 2009-11-04T07:55:48.533 に答える