2012-01-13 34 views
16

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

疑似:

Assembly a = GetAssembly(); 
var dependants = a.GetDependants(); 
+0

プログラム的に必要ですか?そうでない場合は、MS Dependsを使用することができます。 –

+0

プログラム的に。すべての依存型に対して[AddProviderTransparent](http://msdn.microsoft.com/en-us/library/dd783170.aspx)を使用する必要があります。 – Shimmy

+4

どのようにスコープを定義しますか?アセンブリはそれが依存しているものを知ることができますが、それに依存するものを教えてくれますか? +1の質問;) – StaWho

答えて

13

あなたは現在のアプリケーションドメインからの依存アセンブリを検索したい場合は、以下に定義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パラメータを使用すると、すべての検索したいアセンブリを表し扶養家族。

+0

私を含む誰もがそれを考えることのない馬鹿です。ストレートでシンプル。 – Shimmy

+1

+1ニース。私は前にAssembly.GetReferencedAssemblies()を見たことがない。 NET 4.で追加されたように見えます。まあ、あなたは毎日何かを学びます。 –

6

プログラムによる、あなたはこれを行うにはMono.Cecilを使用することができます。

この(デバッガがアタッチされている場合、これは動作しません - 例えば、あなたがVS自体の内部からそれを実行した場合)のようなもの:

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またはReflectorからこの情報を得ることができます。

+0

あなたのコードは、 'assemblyFilePath'によって指し示されたアセンブリによって参照されるアセンブリのリストを返します。そうではありませんか? OPが求めているのはこれですか?私はOPが逆を望んでいる(誤っているかもしれない)と思う:アセンブリAがそれを参照するすべてのアセンブリを見つけると、何か不足していますか? –

+0

ああ - あなたが正しいかもしれません - 今は分かりません。あなたがタイトル(私がここで答えたものを示唆している)またはテキストの説明(あなたが正しいことを示唆している)を読むかどうかによって異なります。 –

+0

合意しました。少し混乱します。しかし、もし私が正しければ、OPはStaWhoによって提起された質問に最初にコメントしなければならないでしょう。私は "スコープ"内のすべてのアセンブリを検索し、それぞれのコードを実行するよりも、この問題を解決する方法が他にありません。 –

1

私は、実行時に依存関係を得るための組み込みの可能性について知らない。 私は最も簡単な解決策は、thisアプリケーションの拡張メソッドとコードを定義することだと思います。私は数年前にアプリケーション自体を使用しました。しかし、コードを使用しないでください。

これが役に立ちます。

2

まず、あなたの例のスコープ定義:自分のアプリケーションのbinディレクトリにある

  1. すべてのアセンブリを

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

  3. 内のすべてのアセンブリのすべてのアセンブリ世界のどんなマシンでも。

そして、単に(*)自分のスコープ内のすべてのアセンブリを反復処理し、彼らはあなたのターゲットアセンブリに依存しているかどうかを確認するためにリフレクションを使用しています。

直接参照と間接参照が必要な場合は、見つけたすべてのアセンブリについてリンスして繰り返す必要があります。

(*)あなたのスコープが上記の3つの場合、非常に単純ではないかもしれません。

関連する問題