2017-12-28 32 views
3

私は依存関係のアセンブリ名、依存DLLがロードされている場所と依存DLLの依存関係を取得しようとしています。C#.Netで依存関係のアセンブリパスを見つける方法

".exe"ファイルのパスが入力されています。

私は次のコードを使用して依存関係を見つける。

var assemblies = Assembly.LoadFile("C:\\My Folder\\ MyApp.exe").GetReferencedAssemblies(); 

"アセンブリ"System.Reflection.AssemblyNameクラスオブジェクトのコレクションです。

私はfor-eachを使用して、アセンブリ名のリストを取得して依存関係リストを検索しています。各依存アセンブリの位置を取得する方法

  1. 従属アセンブリの依存関係の入手方法?たとえば、MyAppアプリケーションでmyAppBase.dllを使用している場合、どのようにmyAppBase.dllの依存関係を取得できますか。

+3

@Stefan MSDN答え1) "Assembly"の "Location"を見てください。 2)アセンブリオブジェクトからアプリケーションの削除を取得できる場合は、参照されたアセンブリの参照アセンブリをアセンブリオブジェクトから取得できますか?私はちょうどその問題を、ドキュメントを読むことの欠如と、そのプロセスに関する論理的な考え方の欠如と見る。一般的に、それは低い努力のようです。 – john

+0

@john:あなたのコメントをありがとう。 AssemblyNameクラスからアセンブリオブジェクトを取得する方法を教えてください。 – Venkat

+1

私は私の提案を追加しました。 – john

答えて

3

このようなものは、すべての参照アセンブリを取得する必要があります。 AssemblyNameをアセンブリに変換するには、アセンブリをロードする必要があります。これは、参照されているすべてのアセンブリで列挙型を返します。 HashSetを渡す必要はありません。無限ループを防ぐための再帰呼び出し用です。

これらをロードしたくない場合は、別のAppDomainに読み込んでアンロードすることをお勧めします。

private static IEnumerable<Assembly> GetReferencedAssemblies(Assembly a, HashSet<string> visitedAssemblies = null) 
{ 
    visitedAssemblies = visitedAssemblies ?? new HashSet<string>(); 
    if (!visitedAssemblies.Add(a.GetName().EscapedCodeBase)) 
    { 
     yield break; 
    } 

    foreach (var assemblyRef in a.GetReferencedAssemblies()) 
    { 
     if (visitedAssemblies.Contains(assemblyRef.EscapedCodeBase)) { continue; } 
     var loadedAssembly = Assembly.Load(assemblyRef); 
     yield return loadedAssembly; 
     foreach (var referenced in GetReferencedAssemblies(loadedAssembly, visitedAssemblies)) 
     { 
      yield return referenced; 
     } 

    } 
} 

DLLの場所として、あなたはそれを取得するために、AssemblyオブジェクトにLocationを使用することができます。

関連する問題