2011-02-11 65 views

回答

1

C#編譯器不會發出這一信息到DLL,所以它不是可用通過反思。但是,正如您從調試中知道的那樣,調試器可以將編譯位置與源代碼位置進行匹配。它通過PDB文件執行此操作。因此,在您發佈PDB文件並調用非託管調試器或診斷符號存儲API(請參閱MSDN中的「常規參考」>「非託管API參考」)以確定給定方法的定義位置時,您可能在原則上有可能。但是,對於一個類你不能真正做到這一點,因爲一個類可以使用部分類分佈在多個文件中。

0

我相信你會得到最接近的是typeof(Customer).Assembly.Location。但是,這隻會給你DLL,而不是源代碼的位置(這是合理的,因爲源代碼通常不會包含在二進制文件中)。

0

* .PDB(調試信息文件)文件應該有這些信息。否則,我看不到它,因爲代碼文件只是編譯代碼不應該關心的抽象。

1

如果您在調試模式下編譯,您可能可以使用Cecil(Mono項目的一部分)從調試符號中提取源文件名。但是當你在發佈模式下編譯時,這些信息可能會丟失。

但是,如果您需要需要來做到這一點,除了軟件的靜態分析之外的其他目的,您可能是在錯誤的軌道上,應該考慮另一種解決方案。

如果你把類的企業命名空間,你可以使用反射來找到一個對象是否來自該命名空間:

namespace Business { 
    class Customer {} 
    class Order {} 
    class OrderLine {} 
} 

var myObject = new Customer(); 
Console.WriteLine(myObject.GetType().Namespace); // writes "Business" 
+0

即使對於發佈版本,您也可以獲得PDB文件,因此Cecil仍然可以作爲選項。 – itowlson 2011-02-11 23:54:49

相關問題