Unity 2.0を一度も使用していないので、.NET Framework 2.0用にこれをコーディングしました。うまくいきたいと思います。あなたがアセンブリのツリー表現を作成することwantoも
まず:
class DependencyTree
{
public string AssemblyName;
public IDictionary<string,DependencyTree> ReferencedAssemblies;
}
今すぐあなたがeasylyこのクラスを使用することができ、ツリーに
class DependencyWalker
{
Dictionary<string, DependencyTree> _alreadyProcessed = new Dictionary<string, DependencyTree>();
public DependencyTree GetDependencyTree(Assembly assembly)
{
// Avoid procesing twice same assembly.
if (_alreadyProcessed.ContainsKey(assembly.FullName))
return _alreadyProcessed[assembly.FullName];
var item = new DependencyTree();
item.AssemblyName = assembly.FullName;
item.ReferencedAssemblies = new Dictionary<string, DependencyTree>();
_alreadyProcessed.Add(item.AssemblyName, item);
foreach (AssemblyName assemblyName in assembly.GetReferencedAssemblies())
{
item.ReferencedAssemblies.Add(assemblyName.FullName, GetDependencyTree(Assembly.Load(assemblyName)));
}
return item;
}
// To print the tree to the console:
public void PrintTree(DependencyTree tree)
{
PrintTree(tree, 0, new Dictionary<string, bool>()); // Using Dictionary because HashSet is not available on .NET 2.0
}
private void PrintTree(DependencyTree tree, int indentationLevel, IDictionary<string,bool> alreadyPrinted)
{
Console.WriteLine(new string(' ', indentationLevel) + tree.AssemblyName);
if (alreadyPrinted.ContainsKey(tree.AssemblyName))
return;
alreadyPrinted[tree.AssemblyName] = true;
foreach (DependencyTree a in tree.ReferencedAssemblies.Values)
PrintTree(a, indentationLevel + 3, alreadyPrinted);
}
}
を歩くと、生成するクラスを作成することができます:
class Program
{
static void Main(string[] args)
{
new System.Xml.XmlDocument().LoadXml("<xml/>"); // Do whatever to ensure System.Xml assembly is referenced.
var startingAssembly = typeof(Program).Assembly;
var walker = new DependencyWalker();
var tree = walker.GetDependencyTree(startingAssembly);
walker.PrintTree(tree);
}
}
出力します。
ConsoleApplication1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Security, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
System.Data.SqlXml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
ジェネレータはループを持っている木を出力していることに注意し、その再帰関数でそれを横断することは無限ループになりますしてください。 PrintTreeでは、alreadyPrinted
リストを使用して無限ループを回避します。 (私はループを避けるために子参照リストを1回だけ印刷します。)YMMVので、必要に応じて変更してください。
対象とする.NETフレームワークまたはNET標準ライブラリはどれですか? –
最初のアプローチでは、どのアセンブリを繰り返し処理するかをフィルタリングすると処理速度が向上する可能性があります。パターンで始まるファイル名でアセンブリのみを処理することも、構成ファイルにアセンブリをリストすることもできます。可能であれば、起動時にそれを行い、辞書などにキャッシュを構築します。 –
2つ目のアプローチでは、再帰関数を使用して、参照されたアセンブリのツリーを 'assembly.GetReferencedAssemblies'で作成する必要があります。作業をスピードアップするには、すでに処理したアセンブリを追跡してください。 –