2010-01-14 85 views
3

我想找到給定類型所依賴的所有類型,包括接口,抽象類,枚舉,結構等。我想加載一個程序集,並打印出一個列表中定義的所有類型,和他們的依賴。如何在任何基於CLR的語言程序集中查找給定類型的所有類型依賴關係?

到目前爲止,我已經能夠找到CLR程序集使用Mono.Cecil所依賴的所有外部類型,例如,

using System; 
using Mono.Cecil; 
using System.IO; 

FileInfo f = new FileInfo("SomeAssembly.dll"); 
AssemblyDefinition assemDef = AssemblyFactory.GetAssembly (f.FullName); 
List<TypeReference> trList = new List<TypeReference>(); 

foreach(TypeReference tr in assemblyDef.MainModule.TypeReferences){ 
    trList.Add(tr.FullName); 
} 

也可以使用單disasembler,如「monodis SomeAssembly.dll --typeref」獲得的這份名單,但這個名單似乎不包括原語,如System.Void,System.Int32等

我需要分別對待每種類型,並獲取給定類型依賴的所有類型,即使類型是在同一個程序集中定義的。 有沒有辦法使用Mono.Cecil或任何其他項目來做到這一點?我知道它可以通過加載程序集,然後遍歷每個定義的類型,然後加載該類型的IL並掃描它的引用,但我相信有更好的方法可以完成。理想情況下,它也可以與匿名內部類一起工作。

如果在同一個組件中定義了多個模塊,它也應該可以工作。

回答

1

AJ, 我有地方,我需要遍歷類型在裝配了同樣的問題,我使用Mono.Cecil能解決。我能夠遍歷每個類的方式,並且如果類中的某個屬性不是另一個類而不是CLR類型,則是通過遞歸函數。

private void BuildTree(ModuleDefinition tempModuleDef , TypeDefinition tempTypeDef, TreeNode rootNode = null) 
    { 
      AssemblyTypeList.Add(tempTypeDef); 

      TreeNode tvTop = new TreeNode(tempTypeDef.Name); 

      // list all properties 
      foreach (PropertyDefinition tempPropertyDef in tempTypeDef.Properties) 
      { 
       //Check if the Property Type is actually a POCO in the same Assembly 
       if (tempModuleDef.Types.Any(q => q.FullName == tempPropertyDef.PropertyType.FullName)) 
       { 
        TypeDefinition theType = tempModuleDef.Types.Where(q => q.FullName == tempPropertyDef.PropertyType.FullName) 
                   .FirstOrDefault(); 
        //Recursive Call 
        BuildTree(tempModuleDef, theType, tvTop); 

       } 

       TreeNode tvProperty = new TreeNode(tempPropertyDef.Name); 
       tvTop.Nodes.Add(tvProperty); 
      } 

      if (rootNode == null) 
       tvObjects.Nodes.Add(tvTop); 
      else 
       rootNode.Nodes.Add(tvTop); 

    } 

這個功能是通過我的main函數調用的要點這是

 public void Main() 
     { 
     AssemblyDefinition assemblyDef = AssemblyDefinition.ReadAssembly(dllname); 

     //Populate Tree 
     foreach (ModuleDefinition tempModuleDef in assemblyDef.Modules) 
     { 
      foreach (TypeDefinition tempTypeDef in tempModuleDef.Types) 
      { 
       BuildTree(tempModuleDef ,tempTypeDef, null); 
      } 
     } 

     } 
1

看看NDepend - 它做到了這一點,還有更多。

-Oisin

+0

謝謝[287]莪, 我知道NDepend的,這是一個偉大的產品。 我想生成一個依賴類型的列表,所以我可以將它餵給另一個工具。因此NDepend不是我需要的工具。 – 2010-01-17 20:44:27

相關問題