基於一些需要,小弟打算在C#裡面印出程式本身的編譯日期與時間,這個在C裡面很簡單,直接使用系統預設的常數就好,如下:
printf("Copyright (c) %s %s . All Rights Reserved.\n", __DATE__, __TIME__);
小弟本來也以為C#應該也差不多吧,想不到歹誌不是蠢人想的那樣,就在萬事問AI的現代,AI竟然也很不靠譜的給了沒用的答案,浪費小弟好許時間測試,都沒達到小弟想要的結果,這時候只好回頭去找Stack Overflow,給的建議也是很奇筢,要不回頭讀自己的檔案系統時間,要不從PE裡面讀取,或是動態建立一個新的檔案當變數或是資源,怎麼看都覺得這些方法脫褲子放屁。好不容易找到一個勉強可以接受的答案就是在.csproj裡面手動加入客製化AssemblyAttribute,程式裡面再去讀取這個屬性,實作如下:
手動加入下列到 *csproj 裡面:<ItemGroup>
<AssemblyAttribute Include="System.Reflection.AssemblyMetadataAttribute">
<_Parameter1>BuildDateTime</_Parameter1>
<_Parameter2>$([System.DateTime]::Now.ToString("yyyy-MM-ddTHH:mm:ss"))</_Parameter2>
</AssemblyAttribute>
</ItemGroup>
在程式裡面加入:
public static string GetBuildDateTime()
{
var attr = Assembly.GetExecutingAssembly()
.GetCustomAttributes<AssemblyMetadataAttribute>()
.FirstOrDefault(a => a.Key == "BuildDateTime");
return attr?.Value ?? "Unknown";
}
呼叫這個函示如下:
Console.WriteLine($"Copyright {GetBuildDateTime()} . All Rights Reserved.");
總算可以正常執行,也沒有一堆奇怪的迂迴的手法。不過真想不到這個看似簡單的功能,在C#裡面竟然這麼麻煩。小弟採用 net8.0 環境。 特此註記。