2012-01-05 18 views
15

Visual Studioでは、例として添付ファイルのdll参照を参照できます。 この参照情報を使用して、(例の)Compositionプロジェクトを開き、参照ファイル名をすべて取得するために、他のすべての参照を続けて見つけることができます。.NET DLL参照/依存関係チェックユーティリティ

このジョブを自動的に実行するユーティリティはありますか? つまり、.NETアセンブリがあれば、すべての参照/依存関係を再帰的にチェックしてDLLの名前を与えます。

cygwinのlddとDepends.exeを確認しましたが、他のプロジェクトのDLLは表示されませんが、システムDLLだけが表示されます。

enter image description here

+1

Assembly.GetReferencedAssemblies()で簡単に書き込むことができます。 EXEで開始します。もちろん、.configファイルとパブリッシャーポリシーでかなり厄介なアセンブリファイルを*見つける*ことができる必要があります。ユニバーサルユーティリティではない理由。 –

答えて

19

はい:ildasm.exe。 SDKと共にインストールされます。

のようなパスになります。C:\ Program Files(x86の)\マイクロソフトのSDK \ Windowsの\ v7.0A \ビン

+0

しかしそれはネイティブのexern dllだけを示しています。ネット参照されたアセンブリを表示する方法? –

+5

マニフェストをダブルクリックすると、参照されている.netアセンブリが表示されます。.assembly extern System.Drawing { .publickeytoken =(B0 3F 5F 7F 11 D5 0A 3A)//。?_....: .VER 4:0:0:0} .assemblyのextern System.Data {.publickeytoken =(B7部7A 5C 56 19 34 E0 89)// .Z \ V.4 .. .VER 4: 0:0:0 } –

+0

はい..私はhttp://stackoverflow.com/questions/18637173/how-is-the-net-referenced-assemblies-names-resolved-by-the-clr-atと混同しました-runtime?noredirect = 1#comment27463835_18637173 –

1

私はあなたのために自動的にこれを行うにはどのツールを知りませんが、私は、ツール(またはあなた)が従わなければならないステップを概説することができます。

各アセンブリにはマニフェストが含まれています。マニフェストには、現在のアセンブリが依存する他のすべてのアセンブリの名前とバージョンが一覧表示されます。最も単純な場合、このトレイルを再帰的に追跡する必要があります。

参照されているアセンブリのファイル名を示す正しい方法はありません。参照はマニフェストにファイル名ではなくアセンブリ名(名前、バージョン、カルチャなど)として格納されます。 .NETランタイムが参照アセンブリをロードする必要がある場合は、さまざまな検索を使用して検索し、これらの検索の結果は環境によって異なる場合があります。もちろん、例えば、開発マシン上のアセンブリを探しているだけの場合は、これは問題ではないかもしれません。

アセンブリ参照を解決する技術には、既にロードされたアセンブリの検索、グローバルアセンブリキャッシュの検索、アプリケーションディレクトリの検索、アプリケーション構成ファイルまたはパブリッシャポリシーに基づくリダイレ​​クトなどがあります。詳細については、MSDNの記事「ランタイムによるアセンブリの検索方法」の記事をご覧ください。さらに、アプリケーションは、System :: AppDomain :: AssemblyResolveイベントを処理することによって、独自の参照解決を行うよう登録することができます。

3

あなたが提供するIldasm.exeをを使用することができ、またはあなたがもう少し何か強力をしたい場合、あなたは試すことができます:

Reflector

をさらに良いことに、無料を試してみてください。

dotPeek

挨拶、

1

ティすべての参照を見つけるのにかなり良い仕事をします。 "temp"は、トレースしたすべての参照のダンプになります。

private void PerformReferenceAnalysis() 
    { 
     StringBuilder builder = new StringBuilder(); 
     HashSet<string> loadedAssemblies = new HashSet<string>(); 
     PerformReferenceAnalysis(System.Reflection.Assembly.GetExecutingAssembly(), builder, string.Empty, loadedAssemblies); 
     string temp = builder.ToString(); 
    } 

    private void PerformReferenceAnalysis(System.Reflection.Assembly assembly, StringBuilder builder, string leadingWhitespace, HashSet<string> loadedAssemblies) 
    { 
     if (builder.Length > 0) 
     { 
      builder.AppendLine(); 
     } 
     builder.Append(leadingWhitespace + assembly.FullName); 
     System.Reflection.AssemblyName[] referencedAssemblies = assembly.GetReferencedAssemblies(); 
     foreach (System.Reflection.AssemblyName assemblyName in referencedAssemblies) 
     { 
      if (loadedAssemblies.Contains(assemblyName.Name)) 
      { 
       continue; 
      } 
      loadedAssemblies.Add(assemblyName.Name); 
      System.Reflection.Assembly nextAssembly; 
      try 
      { 
       nextAssembly = System.Reflection.Assembly.ReflectionOnlyLoad(assemblyName.FullName); 
      } 
      catch (Exception) 
      { 
       try 
       { 
        nextAssembly = System.Reflection.Assembly.ReflectionOnlyLoad(assemblyName.Name); 
       } 
       catch (Exception) 
       { 
        nextAssembly = null; 
       } 
      } 
      if (nextAssembly != null) 
      { 
       PerformReferenceAnalysis(nextAssembly, builder, leadingWhitespace + "| ", loadedAssemblies); 
      } 
     } 
    } 
10

私はこのタイプのチェックのためにAsmSpyを使用したいです。ダウンロードするexeファイルが1つあります。それを私のツールフォルダに入れて簡単にアクセスできます。 https://github.com/mikehadlow/AsmSpy

+3

+1 AsmSpyは、Visual Studio 2013または2015で開くことができる* .dgml形式の出力ファイルを(-dgキーを使用して)生成できます。 VS、**あなたはそれを検索することができます**(Ctrlキーを押しながらF)、興味のあるdll(たとえば、DLLが見つからない)を見つける。 「I」を押すと、それに依存するすべてのDLLが選択されます。次に、グラフのR-Click/Select/Invert Selectionを選択し、キーボードのDeleteキーを押します。dllの欠落に応じてdllの読みやすいグラフが得られます。 dotPeekもILSpy(Reflectorの相続人)も、検索可能な形式で依存関係のリストを生成することはできません。 – farfareast

関連する問題