假設我有一個包含兩個文件的應用程序。 Console.cs
和Business.cs
如何在運行時從已編譯的應用程序確定代碼文件的文件名
Console.cs
有程序Main
類。
Business.cs
有三個類Customer
,Order
和Orderline
。
C#中有沒有反正在運行時(可能反射)確定業務對象位於名爲Business.cs的文件中?
假設我有一個包含兩個文件的應用程序。 Console.cs
和Business.cs
如何在運行時從已編譯的應用程序確定代碼文件的文件名
Console.cs
有程序Main
類。
Business.cs
有三個類Customer
,Order
和Orderline
。
C#中有沒有反正在運行時(可能反射)確定業務對象位於名爲Business.cs的文件中?
C#編譯器不會發出這一信息到DLL,所以它不是可用通過反思。但是,正如您從調試中知道的那樣,調試器可以將編譯位置與源代碼位置進行匹配。它通過PDB文件執行此操作。因此,在您發佈PDB文件並調用非託管調試器或診斷符號存儲API(請參閱MSDN中的「常規參考」>「非託管API參考」)以確定給定方法的定義位置時,您可能在原則上有可能。但是,對於一個類你不能真正做到這一點,因爲一個類可以使用部分類分佈在多個文件中。
我相信你會得到最接近的是typeof(Customer).Assembly.Location
。但是,這隻會給你DLL,而不是源代碼的位置(這是合理的,因爲源代碼通常不會包含在二進制文件中)。
* .PDB(調試信息文件)文件應該有這些信息。否則,我看不到它,因爲代碼文件只是編譯代碼不應該關心的抽象。
如果您在調試模式下編譯,您可能可以使用Cecil(Mono項目的一部分)從調試符號中提取源文件名。但是當你在發佈模式下編譯時,這些信息可能會丟失。
但是,如果您需要需要來做到這一點,除了軟件的靜態分析之外的其他目的,您可能是在錯誤的軌道上,應該考慮另一種解決方案。
如果你把類的企業命名空間,你可以使用反射來找到一個對象是否來自該命名空間:
namespace Business {
class Customer {}
class Order {}
class OrderLine {}
}
var myObject = new Customer();
Console.WriteLine(myObject.GetType().Namespace); // writes "Business"
即使對於發佈版本,您也可以獲得PDB文件,因此Cecil仍然可以作爲選項。 – itowlson 2011-02-11 23:54:49