2012-10-23 49 views
3

我正在尋找一組編譯.net程序集中的特定類的相關源文件。查找編譯類的源文件在c#中

例如

MyAsm.Namespace.Foo -> C:\Source\foo.cs 
MyAsm.Namespace.Bar -> C:\Source\Code\MoreCode\Common.cs 
MyAsm.Namespace2.Bar -> C:\Source\Code\MoreCode\Common.cs 
... 

我有裝配反射/提取我感興趣的使用標準System.Reflection功能工作類型的信息。

我現在需要找到該類的原始.cs源文件。儘管我已經採取了一種蠻力解決方案作爲解決方法,但其速度令人難以接受。

我希望整個過程在5秒內完成。目前,反射提取部分不到1秒,'文件關聯'需要幾分鐘。我不認爲在4秒內掃描幾個MB並不合理。

不幸的是,有一些警告,它可以防止快捷方式。

  • 我不知道該文件的名稱,所以我需要做一個dir/s *.cs每次運行時,列舉所有潛在的源文件。

  • 該類名不總是匹配源文件,它可以提示在可能的位置,但它不能保證工作。

  • 在某些情況下,多個類在相同的文件中定義。

  • 有~20k .cs文件/ 63MB的源代碼。

  • 我需要一個〜10k的類/他們的文件之間的關聯。

  • 我不想逐步建立一個數據庫,其中聲明的文件名/類,因爲文件內容會改變,我會有維護這個數據庫等的麻煩(雖然我可能要去如果一切都失敗,請下載此路線)。

  • 操作系統的這個將會運行,不會有窗口搜索/索引啓用,所以也沒有喜悅。

我已經試過:

  • 使用的Findstr.exe - 速度過慢

  • 創建.NET應用程序,所有文件加載到內存中。 - 太慢找不到* .cs /加載所有 文件,一旦它們在內存中,就可以快速掃描文件。

  • 從所有較小的文件創建一個大的源文件,加載它,掃描等 - 再次,太慢了。花費幾分鐘的時間來構建文件,一旦加載就快速。

  • 閱讀PDB文件 - 我正在研究PDB2XML.exe,雖然它輸出文件名,並且運行速度很快,但我不知道如何將一個類與文件名相關聯。

那麼,有沒有人有替代建議,魔術或PDB2XML的一些經驗?

+2

如果原始源文件不存在於系統中,該怎麼辦? –

+0

很簡單的事情做的是做類名稱的文件搜索,像發現含有'類\ S + ' –

+0

@BenFinkel他們的所有文件。多數民衆贊成在一件事我可以保證 – jasper

回答

1

使用PDBS是你的最佳選擇恕我直言,如果這些文件在磁盤上。文件名(由ISymbolDocument.URL表示)與序列點相關。序列點與方法(包括屬性獲取/設置)相關,而不是類。當然,.NET類源可以存儲在多個文件中。所以你必須瀏覽一個類型的所有成員(例如使用反射)來確定所有相應的文件。

+0

這正是我要找的。有一件事,它並不是每個方法都會返回'GetSequencePoints'的輸出。從我能看到的自動屬性。這是有道理的,因爲調試器沒有經過它們。任何方式來關聯他們? – jasper

+0

正如您發現的那樣,編譯器不會爲自動屬性發出任何符號,因此如果該類只包含這些符號,您將無法確定其源文件。但這應該是非常罕見的。 –

0

我不知道,有文件名,並在.NET程序集名稱之間的任何關係,實際上有可能在一個文件中定義多個組件,所以我看不出你如何能做到這一點沒有物理查看每個源代碼文件並搜索類定義或維護運行索引。

1

這不正是解決你所面臨的問題,因爲你想獲得一個任意類的文件路徑,但是這是很容易的工作給我使用這僅僅是從源頭上得到一個指向某些文件位置。我在單元測試中使用它,所以性能不是非常重要。

var x = new StackTrace(true); 
var file = x.GetFrame(0).GetFileName(); 
+0

我應該在問題中說過這一點,但我需要在編譯時解決,或者在編譯之後,而不是運行時解決。西蒙的回答是我所要求的。 – jasper

+0

哦,不,我不認爲這解決您的具體問題非常好,但我把它放在這裏,因爲它不應該有一個全新的問題,我想分享的信息。 –