質問

特定のアセンブリに依存するすべてのアセンブリを取得する方法はありますか?

擬似:

Assembly a = GetAssembly();
var dependants = a.GetDependants();
役に立ちましたか?

解決

現在のアプリケーションドメインから従属アセンブリを見つけたい場合は、 GetDependentAssemblies 以下で定義されている関数:

private IEnumerable<Assembly> GetDependentAssemblies(Assembly analyzedAssembly)
{
    return AppDomain.CurrentDomain.GetAssemblies()
        .Where(a => GetNamesOfAssembliesReferencedBy(a)
                            .Contains(analyzedAssembly.FullName));
}

public IEnumerable<string> GetNamesOfAssembliesReferencedBy(Assembly assembly)
{
    return assembly.GetReferencedAssemblies()
        .Select(assemblyName => assemblyName.FullName);
}

analyzedAssembly パラメーターは、すべての依存者を見つけたいアセンブリを表します。

他のヒント

プログラムでは、使用できます Mono.Cecil これをする。

このようなもの(デバッガーが添付されている場合、これは機能しないことに注意してください。

public static IEnumerable<string> GetDependentAssembly(string assemblyFilePath)
{
   //On my box, once I'd installed Mono, Mono.Cecil could be found at: 
   //C:\Program Files (x86)\Mono-2.10.8\lib\mono\gac\Mono.Cecil\0.9.4.0__0738eb9f132ed756\Mono.Cecil.dll
   var assembly = AssemblyDefinition.ReadAssembly(assemblyFilePath);
   return assembly.MainModule.AssemblyReferences.Select(reference => reference.FullName);
}

このプログラムで行う必要がない場合は、 ndepend また リフレクター この情報を提供できます。

最初にスコープを定義します。

  1. アプリケーションのBINディレクトリ内のすべてのアセンブリ

  2. アプリケーションのBinディレクトリのすべてのアセンブリ + GAC内のすべてのアセンブリ

  3. 世界のあらゆるマシンのすべてのアセンブリ。

次に、単純に(*)スコープ内のすべてのアセンブリを反復し、反射を使用してターゲットアセンブリに依存するかどうかを確認します。

間接的および直接的な参照が必要な場合は、見つけたすべてのアセンブリをすすぎ、繰り返す必要があります。

(*)スコープが上記の場合、それほど単純ではないかもしれません。

実行時に依存関係を取得するための組み込みの可能性については知りません。したがって、最も簡単なソリューションは拡張メソッドを定義し、からコードを使用することだと思います。 これ 応用。私は何年も前にアプリケーション自体を使用しました。しかし しない それのコードを使用します。

お役に立てれば。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top