2012-08-09 23 views
1

可能重複:
Finding all Namespaces in an assembly using Reflection (DotNET)列明的命名空間中的DLL使用

讓我們考慮我有我的10至30 DLL列表,我需要列出所有的命名空間由這些DLL導入。

我試圖與下面使用反射代碼

string[] fileEntries = Directory.GetFiles(sDir, "*.dll"); 
       foreach (string fileName in fileEntries) 
       { 
        Assembly assembly = Assembly.LoadFrom(fileName); 
        List<string> namespaces = new List<string>(); 
        foreach (var type in assembly.GetTypes()) 
        { 
         string ns = type.Namespace; 
         if (!namespaces.Contains(ns)) 
         { 
          namespaces.Add(ns); 
          Console.WriteLine(ns); 
         } 
        } 

       } 

但它只retrives這些DLL的唯一的命名空間。

例如,讓我們考慮一個程序

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.IO; 

namespace sample 
{ 
    public partial class sample : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      string pth = filepth("D:/sample1/s.txt"); 
      createfile(pth); 
      Response.Write("File created on path :" + pth); 
     } 
    }  
} 

基礎上,上面的代碼retrives只樣本,但我需要retrive作爲

**

using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Web; 
    using System.Web.UI; 
    using System.Web.UI.WebControls; 
    using System.IO; 
所有命名空間

**

你能引導我把它..

等待着您的寶貴意見

+1

@Cory,topicstarter希望找到所有類型,在彙編中使用,並使用它們構建名稱空間列表,而不僅僅是由他自己創建的類型。 – Dennis 2012-08-09 05:40:55

+0

@丹尼斯:點了點。據稱重複取消! – 2012-08-09 05:45:42

回答

2

有沒有在運行時的任何命名空間。 此外,在您提供的示例中,並非來自所用源代碼的每個名稱空間(從上下文菜單中執行「組織使用 - >刪除未使用的用途」)。

您可以查找特定程序集的引用程序集,而不是命名空間。 要做你想做的,你需要知道類型,使用(沒有聲明,這很容易得到!)特別是程序集的代碼。

我不知道,如何在不分析IL代碼的情況下做到這一點。 希望,Cecil可以幫助你......但這並不容易,也不是僅反射任務。

引文從MSDN中的言論爲MethodBody類:

您可以使用該模塊類的令牌解析方法,如 ResolveType,ResolveMethod和ResolveType,解決了令牌 的方法體到Type對象,MethodInfo對象和FieldInfo對象,這些對象提供有關類型,方法, 和方法體中MSIL訪問的字段的詳細信息。解析方法 機構需要深入瞭解元數據和MSIL 指令格式。信息可以在公共語言 基礎結構(CLI)文檔

找到你想了解CLI規範自己呢?:)

+0

沒有命名空間,但有完全限定的類型名稱:) – 2012-08-09 05:41:03

+0

@SimonWhitehead,更新了答案。 – Dennis 2012-08-09 05:46:33

+0

雅謝謝@dennis,但與反射使用塞西爾反射我們可以檢索代碼或名稱空間是否有可能 – GowthamanSS 2012-08-09 06:21:50

0

你想要的不是一件容易的事情,反思當然不是要走的路。主要是因爲它不會讓你訪問引用他們正在使用的類的方法的來源。

我能想到的唯一解決方案是工具cci,它爲您提供遍歷dll所有組件的方法。特別是您可以訪問每行代碼中引用的每種類型/方法,並生成您想要的列表。

+0

感謝您的評論是否有可能通過代碼? – GowthamanSS 2012-08-09 06:22:51

+0

我會是代碼。 Cci是一組dll,你可以用它來創建一個你想要的程序。 – Rafal 2012-08-09 06:27:51

0

右鍵單擊使用塊,然後在 上下文菜單中找到「組織使用」,其中有一個名爲「刪除未使用的使用方法」的函數。

上述說明與您的問題無關,但它告訴我們一個事實,即使用.cs文件頂部的使用塊有時不被使用。除非您像Visual Studio一樣分析整個代碼,否則很難判斷是否使用了命名空間。

而且使用反射,就像在你的代碼assembly.GetTypes(),給人在裝配定義的類型,不用於組件中

+0

我不清楚你的解決方案..... – GowthamanSS 2012-08-09 06:24:21