2009-08-20 97 views
13

C#中是否有等效的__DATE____TIME__C#中__DATE__,__TIME__宏的等價物#

基本上我想要做的是在C#應用程序中放置一些構建時間戳。

One possibility我看到微軟的網站是要做到以下幾點:「1.0

Assembly assem = Assembly.GetExecutingAssembly(); 
Version vers = assem.GetName().Version; 
DateTime buildDate = new DateTime(2000, 1, 1).AddDays(vers.Build).AddSeconds(vers.Revision * 2); 
Console.WriteLine(vers.ToString()); 
Console.WriteLine(buildDate.ToString()); 

但是,這隻能如果你的版本的AssemblyInfo.cs是,這我們也不會。

回答

4

我建議自定義您的構建腳本以將日期時間寫入文件。 MSBuild Community Tasks項目有一個時間任務,可以用於這一點。

+0

謝謝,這看起來像是最直接的插入方式某處的時間戳。 – 2009-08-21 17:17:30

+0

除插入時間戳外,還可以提取已插入的時間戳。請參閱http://stackoverflow.com/questions/1600962/displaying-the-build-date以獲取代碼以獲取鏈接器放入的內容。在PE和COFF文件標題發生更改之前可能很好。 – 2015-11-10 17:49:34

2

如果你想自動生成您的構建和版本號,我會考慮以下項目在CodePlex上:

http://autobuildversion.codeplex.com/

+0

我不想生成版本號,因爲我們已經有一個預先存在的約定來堅持。只是想在應用程序的某處嵌入編譯時間。 – 2009-08-20 22:48:32

+0

出於好奇,爲什麼你需要嵌入的構建時間? – jrista 2009-08-20 23:46:50

+0

沒有任何真正的原因,我經常發現打印出某種打印時間非常方便,因爲我們的版本號不會與我們製作的每個版本衝突。 – 2009-08-21 17:14:11

1

你可以看看定製的.csproj文件中的項目。這只是一個普通的msbuild文件,您可以掛鉤到BeforeBuild目標中來生成或更新文件,也許可以將此值存儲在自定義程序集級屬性中。

我想象一下msbuild社區任務在這裏會很有用,因爲他們有一些有用的任務,例如文件中的令牌替換。

0

醜陋,並且需要一定的權限,但如果這是供內部使用:

  // assume the relevant using statements above... 
      FileVersionInfo vi = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location); 
      FileInfo fileInfo = new System.IO.FileInfo(vi.FileName); 
      DateTime createTime = fileInfo.CreationTime; 
0

日期時間DATE = File.GetLastWriteTime(Application.ExecutablePath);

1

簡短回答:。沒有相應的東西。他們離開了它。太糟糕了。跟你開玩笑。

有一些近乎相當的變通,都基於程序檢查自己。沒有一個是理性的,優雅的或堅固的。

某些解決方案從「AssemblyVersion」中獲取編譯日期+時間,該編譯日期是四個UInt16字段(「主要版本」,「次要版本」,「內部版本號」和「版本」)的結構,不保證以包含日期和時間在所有,更少以特定的格式。如果您將AssemblyVersion設置爲「ab *」(並且沒有人更改它),那麼編譯器會將其覆蓋爲abcd,其中c = 2000天,d * 2 = 2000年1月1日00:00(當地時間) ,但忽略夏令時),目前它解析AssemblyInfo.cs。這些被編譯到程序中,可以通過System.Reflection.Assembly.GetExecutingAssembly()。GetName()。Version來訪問它們。

其他解決方案具有可執行文件到達到文件系統從自己的元數據,這是很容易被轉移通過FAT,CDFS,或FTP與改變或損壞拿起它的「最後修改」日期+時間DST或時區更改,直接放棄元數據的惰性FTP服務器或根據請求更改元數據的文件實用程序。青衫。

編譯時常量(或常量),可能被稱爲#NOW(或#YEAR,#MONTH,#DAY等),可以在表達式中使用或分配給const或a只讀? CodeWarrior C,GCC,MS C和MS C++提供標準的預定義宏__DATE____TIME__,它們可以像編譯時字符串常量一樣使用。這看起來像是C#中的一個明顯遺漏,它讓每個人都浪費人物年,詢問和設置解決方法。新的語言,新的代碼,可悲的搖搖晃晃的設計。 C#沒有宏。 C#的#define只有「已定義」或「未定義」。所以呢?我沒有理由刪除重要的編譯時常量。把它放入C#的假專業處理器怎麼樣?

17年後進入「簡單管理C」/「類C面嚮對象語言」,CIL和CLR,這是什麼?一百萬種編寫代碼的方式不符合它的要求(線程的實現)?揭露「底層方法」的每一個缺陷的圖書館?您必須針對一個(或兩個)兩個單獨的虛擬機:32位硬件(或仿真器)的32位虛擬機和64位硬件的64位虛擬機(僅限於) - 虛擬機? Java編譯一次,僅爲一個虛擬機,當然每個平臺(32或64)都有單獨的實現。