依存するアセンブリを取得しますか?
-
27-10-2019 - |
質問
特定のアセンブリに依存するすべてのアセンブリを取得する方法はありますか?
擬似:
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);
}
最初にスコープを定義します。
アプリケーションのBINディレクトリ内のすべてのアセンブリ
アプリケーションのBinディレクトリのすべてのアセンブリ + GAC内のすべてのアセンブリ
世界のあらゆるマシンのすべてのアセンブリ。
次に、単純に(*)スコープ内のすべてのアセンブリを反復し、反射を使用してターゲットアセンブリに依存するかどうかを確認します。
間接的および直接的な参照が必要な場合は、見つけたすべてのアセンブリをすすぎ、繰り返す必要があります。
(*)スコープが上記の場合、それほど単純ではないかもしれません。
実行時に依存関係を取得するための組み込みの可能性については知りません。したがって、最も簡単なソリューションは拡張メソッドを定義し、からコードを使用することだと思います。 これ 応用。私は何年も前にアプリケーション自体を使用しました。しかし しない それのコードを使用します。
お役に立てれば。
所属していません StackOverflow