یک نکتهی تکمیلی: چگونه تاریخ Build را به اسمبلی برنامه اضافه کنیم؟
شاید علاقمند باشید که بجای نمایش شماره نگارش برنامه، تاریخ Build آنرا در قسمتی خاص، نمایش دهید. برای اینکار میتوان یک ویژگی جدید را به صورت زیر به اسمبلی برنامه اضافه کرد:
[AttributeUsage(AttributeTargets.Assembly)] public sealed class BuildDateAttribute : Attribute { public BuildDateAttribute(string buildDateTime) => BuildDateTime = buildDateTime; public string BuildDateTime { get; } }
تا در زمان کامپایل برنامه، فایل obj\Debug\net8.0\DntSite.Web.AssemblyInfo.cs را به این صورت تکمیل کند:
using System; using System.Reflection; [assembly: DNTCommon.Web.Core.BuildDateAttribute("1403.05.28.15.17")] [assembly: System.Reflection.AssemblyCompanyAttribute("DntSite.Web")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
مقدار دهی این این ویژگی جدید، در زمان Build و توسط تنظیمات زیر در فایل csproj. برنامه انجام میشود:
<Project> <ItemGroup> <AssemblyAttribute Include="DNTCommon.Web.Core.BuildDateAttribute"> <_Parameter1>$([System.DateTime]::Now.ToString("yyyy.MM.dd.HH.mm"))</_Parameter1> </AssemblyAttribute> </ItemGroup>
با استفاده از AssemblyAttribute میتوان پارامترهای دلخواهی را به ویژگی Include شده، ارسال کرد؛ برای مثال، تاریخ جاری سیستم را. اگر تعداد پارامترهای سازنده بیشتر بود، میتوان Parameter2_ و Parameter3_ و ... را هم تنظیم کرد.
همین اندازه تنظیم برای اضافه شدن خودکار این ویژگی جدید به اسمبلی نهایی برنامه کافی است (و همانطور که عنوان شد، محل درج خودکار اولیهی آن، در فایل AssemblyInfo.cs پوشهی obj برنامهاست). برای خواندن و نمایش آن هم میتوان به صورت زیر عمل کرد:
public static class BuildDateAttributeExtensions { public static string? GetBuildDateTime(this Assembly? assembly) => assembly?.GetCustomAttribute<BuildDateAttribute>()?.BuildDateTime ?? assembly?.GetName().Version?.ToString(); }
برای نمونه میتوان اطلاعات BuildDateAttribute اسمبلی جاری را به صورت زیر استخراج کرد:
private static string? GetVersionInfo() => Assembly.GetExecutingAssembly().GetBuildDateTime();