هنگامیکه یه فایل PE برای یه اسمبلی تولید میشه (چه توسط csc.exe و چه بوسیله al.exe)، اطلاعات استانداردی برای نگهداری نسخه کامل اسمبلی هم به اون فایل اضافه میشه. این استاندارد مطابق استاندارد نسخه Win32 هستش. برای آشنایی بیشتر با ساختار داده ای این منبع تو یه فایل استاندارد ویندوزی میشه از اینجا کمک گرفت.
برای مشاهده خلاصه ای از این داده ها میشه از پنجره پراپرتی های فایل کمک گرفت. تو ویندوز ویستا به بعد، این داده ها تو تب Details نشون داده میشه. مثلا پنجره پراپرتی های فایل PE مثال مطلب قبلی (p.exe) تو تصویر زیر نشون داده شده:
البته با توجه به اینکه این اطلاعات صراحتا تو زمان کامپایل فراهم نشده، کامپایلر از مقادیری پیش فرض استفاده کرده.
برای دسترسی به این اطلاعات با برنامه نویسی و تو زمان اجرا، میشه از متد استاتیک GetVersionInfo کلاس FileVersionInfo استفاده کرد. این کلاس تو فضای نام System.Diagnostics قرار داره. این متد نشانی یه فایل رو بصورت یه رشته دریافت کرده و به عنوان نتیجه یه نمونه از کلاس FileVersionInfo برمیگردونه. پراپرتی های این کلاس به شرح زیره:
نام | شرح |
---|---|
Comments | کامنتهای مرتبط با فایل |
CompanyName | نام شرکتی که فایل رو تولید کرده |
FileBuildPart | شماره بیلد (تولید) فایل |
FileDescription | شرح فایل |
FileMajorPart | قسمت اصلی شماره نسخه فایل |
FileMinorPart | قسمت فرعی شماره نسخه فایل |
FileName | نام فایل |
FilePrivatePart | عدد قسمت خصوصی فایل |
FileVersion | شماره کامل نسخه فایل |
InternalName | نام درونی فایل در صورت وجود |
IsDebug | آیا فایل برای حالت دیباگ تولید شده؟ |
IsPatched | آیا فایل پس از تولید دچار تغییر شده؟ |
IsPreRelease | آیا فایل برای ارائه نهایی محصول تولید شده؟ |
IsPrivateBuild | آیا فایل با فرایند استاندارد ریلیز محصول تولید شده؟ |
IsSpecialBuild | آیا فایل با یه بیلد خاص تولید شده؟ |
Language | زبان تنظیم شده تو اطلاعات نسخه فایل |
LegalCopyright | اطلاعات کپی رایت فراهم شده برای فایل |
LegalTrademarks | اطلاعات نام تجاری و سایر موارد مرتبط فراهم شده برای فایل |
OriginalFilename | نام اصلی فایل که با اون تولید شده |
PrivateBuild | اطلاعات مرتبط با یه نسخه خصوصی از فایل |
ProductBuildPart | شماره بیلد محصولی که این فایل برای اون تولید شده |
ProductMajorPart | شماره اصلی نسخه محصولی که این فایل برای اون تولید شده |
ProductMinorPart | شماره فرعی نسخه محصولی که این فایل برای اون تولید شده |
ProductName | نام محصولی که این فایل برای اون تولید شده |
ProductPrivatePart | شماره بخش خصوصی محصول مربوطه |
ProductVersion | شماره کامل نسخه محصول مربوطه |
SpecialBuild | اطلاعات بیلد ویژه فایل |
برای دریافت اطلاعات بیشتر درباره هریک از این پراپرتی ها به لینک مربوطه مراجعه کنین.
برای مقداردهی این پراپرتی ها برای هر اسمبلی میشه از attributeهای سطح اسمبلی موجود استفاده کرد. برای مثال بصورت زیر:
using System.Reflection; // FileDescription version information: [assembly: AssemblyTitle("عنوان اسمبلی")] // Comments version information: [assembly: AssemblyDescription("شرح عملکرد اسمبلی")] // CompanyName version information: [assembly: AssemblyCompany("شرکت یوسف نژاد")] // ProductName version information: [assembly: AssemblyProduct("محصول شرکت یوسف نژاد")] // LegalCopyright version information: [assembly: AssemblyCopyright("Copyright (c) 2013")] // LegalTrademarks version information: [assembly: AssemblyTrademark("trademark of Yusefnejad")] // AssemblyVersion version information: [assembly: AssemblyVersion("1.0.5.0")] // FILEVERSION/FileVersion version information: [assembly: AssemblyFileVersion("1.0.5.67")] // PRODUCTVERSION/ProductVersion version information: [assembly: AssemblyInformationalVersion("1.0.5.0")] // Set the Language field (discussed later in the "Culture" section) [assembly: AssemblyCulture("")]
نکته ای که برای استفاده از این attributeهای سطح اسمبلی باید درنظر گرفت اینه که خطوط کد بالا باید تو بیرون فضای کلاسها بکار بره. برای آشنایی بیشتر با این attributeها به اینجا یه سری بزنین.
با استفاده از کدهای ارائه شده تو قسمت قبل تو یه اسمبلی و کامپایل اون، فایلی تولید میشه که پنجره پراپرتی اون بصورت زیره:
متاسفانه ویندوز اکسپلورر بیشتر این داده ها را نشون نمیده، بنابراین برای دیدن این اطلاعات باید از روشهای دیگه ای استفاده کرد. مثلا با استفاده از PowerShell میشه اطلاعات بیشتری رو بدست آورد. تو این روش از دستور زیر استفاده میشه:
نتیجه اجرای این دستور تو پنجره PowerShell به اینصورته:
میبینید که تمامی اطلاعات نسخه فایل با این روش بدست میاد. یادگیری PowerShell ویندوز رو میتونین از اینجا شروع کنین.
با استفاده از سوییچهای خط فرمان ابزار AL.exe هم میشه این اطلاعات رو تنظیم کرد. دقت کنین که متاسفانه کامپایلر #C چنین امکاناتی رو فراهم نمیکنه و تو این حالت تنها با استفاده از همون Attributeهای گلوبال میشه این مقادیر رو وارد کرد. برای آشنایی بیشتر با این سوییچها و مقادیر متناظرش تو منابع نسخه یه فایل تو ویندوز جدول زیر ارائه میشه:
منبع نسخه | سوییچ AL.exe | توضیحات |
---|---|---|
FILEVERSION | fileversion/ | System.Reflection.AssemblyFileVersionAttribute |
PRODUCTVERSION | productversion/ | System.Reflection.AssemblyInformationalVersionAttribute |
FILEFLAGSMASK | (none) | همیشه به VS_FFI_FILEFLAGSMASK مقداردهی میشه (تعریف شده توفایل WinVer.h با مقدار 0x0000003F) |
FILEFLAGS | (none) | همیشه برابر با 0 |
FILEOS | (none) | درحال حاضر همیشه برابر با VOS__WINDOWS32 |
FILETYPE | target/ | مقداردهی به VFT_APP اگر target:exe/ یا target:winexe/ فراهم شده باشه، مقداردهی به VFT_DLL اگر target:library/ فراهم شده باشه. |
FILESUBTYPE | (none) | همیشه به VFT2_UNKNOWN مقداردهی میشه. (این فیلد برای VFT_APP و VFT_DLL هیچ مفهومی نداره.) |
AssemblyVersion | version/ | System.Reflection.AssemblyVersionAttribute |
Comments | description/ | System.Reflection.AssemblyDescriptionAttribute |
CompanyName | company/ | System.Reflection.AssemblyCompanyAttribute |
FileDescription | title/ | System.Reflection.AssemblyTitleAttribute |
FileVersion | version/ | System.Reflection.AssemblyFileVersionAttribute |
InternalName | out/ | به نام فایل خروجی بدون پسوند مقداردهی میشه |
LegalCopyright | copyright/ | System.Reflection.AssemblyCopyrightAttribute |
LegalTrademarks | trademark/ | System.Reflection.AssemblyTrademarkAttribute |
OriginalFilename | out/ | به نام فایل خروجی بدون مسیر مقداردهی میشه |
PrivateBuild | (none) | همیشه خالی |
ProductName | product/ | System.Reflection.AssemblyProductAttribute |
ProductVersion | productversion/ | System.Reflection.AssemblyInformationalVersionAttribute |
SpecialBuild | (none) | همیشه خالی |
در ادامه درباره داده های نسخه اسمبلی بیشتر بحث میشه.
.: :.