تو قسمت قبلی مطالب مقدماتی داده های نسخه اسمبلی ارائه شد. در ادامه و تو این قسمت مباحث تکمیلی این موضوع، شامل شماره نسخه و فرهنگ اسمبلی و همچنین نحوه کار با این داده ها تو ویژوال استودیو (که بیشتر به محیط عملی توسعه نزدیکه) ارائه میشه.
اونچه که در عمل بیشتر به عنوان نسخه یه فایل یاد میشه، همین شماره نسخه اونه. این شماره تو دات نت از چهار بخش اصلی عددی تشکیل شده که با نقطه از هم جدا میشن. این چهار بخش عبارتنداز:
1. شماره اصلی یا Major Number
2. شماره فرعی یا Minor Number
3. شماره ساخت یا Build Number
4. شماره بازبینی یا Revision Number
مثلا شماره نسخه 1.7.53.2 رو درنظر بگیرین. تو این شماره نسخه، شماره اصلی برابر 1، شماره فرعی برابر 7، شماره ساخت برابر 53 و شماره بازبینی برابر 2 هستش. در حالت عمومی شماره نسخه ای که عرضه میشه، تنها شامل شماره اصلی و فرعی، برای این مثال برابر 1.7، هست.
عدد سوم یا شماره ساخت، 53، نشون دهنده تعداد بیلد پروژه هست و در واقع شماره بیلد جاری رو نشون میده. مثلا اگه تو یه شرکتی عملیات بیلد نهایی یه محصول بصورت روزانه انجام میشه (کاری که تو بیشتر شرکتهای امروزی مرسومه)، این شماره ساخت نسخه اسمبلی هم باید بصورت روزانه افزایش پیدا کنه.
عدد چهارم یا شماره بازبینی، 2، نشون دهنده تعداد بازبینی بیلد جاریه. مثلا یه بیلد خاص نیاز داره تا با توجه به شرایط موجود دوباره انجام بشه که در اینصورت این شماره مطابق اون افزایش پیدا میکنه. این روش نامگذاری فایل و اسمبلی توسط مایکروسافت و بسیاری از شرکتهای معروف و بزرگ دیگه استفاده میشه و شدیدا توصیه میشه که از همین روش تو توسعه محصولات دات نتی پیروی بشه.
تو داده های نسخه یه اسمبلی 3 نوع مختلف شماره نسخه وجود داره که بیشتر مواقع باعث سردرگمی کاربران و برنامه نویسان میشه. این سه نسخه در ادامه معرفی میشن:
- AssemblyFileVersion: این شماره، مقداریه که تو منبع نسخه فایل ذخیره میشه. این شماره تنها برای هدف اطلاع رسانی ذخیره میشه و CLR هیچ جا از این شماره استفاده نمیکنه. درواقع تنها جهت نمایش عمومی شماره نسخه فایل برای همه کاربران از این شماره استفاده میشه. بنابراین تو این شماره، قسمتهای ساخت و بازبینی، بعد از هر بیلد بروزرسانی میشن. متاسفانه بروزرسانی خودکار این شماره توسط ابزارهای موجود (csc.exe و al.exe) در هنگام تولید اسمبلی انجام نمیشه و باید بصورت دستی انجام بشه. این شماره همون مقداریه که توسط اکسپلورر ویندوز نمایش داده میشه.
- AssemblyInformationalVersion: این شماره هم مثل شماره قبلی، تنها برای اهداف نمایشی تولید و تو منبع نسخه Win32 فایل ذخیره میشه و CLR با اون هیچ کاری نداره. از این شماره برای نمایش شماره نسخه محصولی که تو فایل قرار داره استفاده میشه. برای روشن شدن بیشتر این مفهوم مثلا درنظر بگیرین که محصولی با شماره نسخه 2.0 از چندین اسمبلی و فایل تشکیل شده و یکی از این اسمبلی به دلیل جدید بودن با شماره نسخه 1.0 توزیع میشه. تو این اسمبلی جدید نسخه فایل 1.0 و نسخه محصول 2.0 خواهد بود. در عمل برای نمایش عمومی، قسمت های اصلی و فرعی این شماره مقداردهی شده و سپس قسمتهای ساخت و بازبینی این شماره هم با هر بار بیلد بصورت دستی بروزرسانی میشن.
- AssemblyVersion: این شماره تو جدول AssemblyDef تو مانیفست اسمبلی ذخیره میشه (برای آشنایی با این جداول تو متادیتای اسمبلی به مطالب متادیتا و مانیفست مراجعه کنین). این شماره ایه که CLR تو فرایندهای خودش مثل Assembly Binding و Assembly Loading استفاده میکنه.
درضمن برخلاف دو شماره قبلی، تولید خودکار قسمتهای سوم و چهارم این شماره، یعنی شماره های ساخت و بازبینی، رو میشه به کامپایلر سی شارپ سپرد. برای اینکار کافیه تا از کاراکتر «*» به جای خود شماره استفاده بشه. یعنی مثلا میشه از *.1.7.53 یا *.1.7 هم برای مثال این مطلب استفاده کرد. تو این حالت قسمت های سوم و چهارم شماره نسخه اسمبلی بصورت خودکار و با یه فرمول مخصوص تولید میشن. شماره ساخت (build number) برای تولید خودکار برابر تعداد روزهای گذشته از روز «اول ژانویه 2000» قرار داده میشه. شماره بازبینی هم برابر تعداد ثانیه های گذشته از نیمه شب تقسیم بر 2 تنظیم میشه. درصورت استفاده از این روش میشه از زمان و تاریخ دقیق بیلد اسمبلی هم باخبر شد. البته اگه تاریخ و زمان سیستمی که اسمبلی رو ساخته درست باشه.
این شماره برخلاف دوتای بالایی اهمیت زیادی تو پلتفرم دات نت داره و بخشی از نام قوی (Strong Name) یه اسمبلی به حساب میاد، بنابراین برای شناسایی یه اسمبلی از اون استفاده میشه. هنگام آغاز توسعه یه اسمبلی باید هر چهار قسمت این شماره به مقادیری مناسب تنظیم بشن و تا زمانیکه دلیلی مناسب وجود نداشته باشه نباید تغییر بکنن. مثلا وقتیکه اسمبلی «یک» یه ریفرنسی به اسمبلی «دو» که یه نام قوی داره داشته باشه، شماره نسخه اسمبلی «دو»، تو جدول AssemblyRef به همراه سایر اطلاعات موردنیاز تو اسمبلی «یک» ذخیره میشه و از این شماره برای یافتن و بارگذاری اون در زمان اجرا استفاده میشه. بنابراین درصورت تغییر این شماره در آینده و بروزرسانی فایل اسمبلی «دو» بدون بروزرسانی اسمبلی «یک»، دیگه برنامه قادر به اجرا نیست. البته امکانی به نام binding redirect تو CLR وجود داره که میشه با استفاده از یکسری تنظیمات فایل کانفیگ برنامه، تو فرایند Assembly Binding تغییرات موردنیاز رو بصورت دستی اعمال و مشکلات این چنینی رو حل کرد.
فرهنگ (Culture)
بخش دیگه ای از هویت منحصر به فرد اسمبلی، فرهنگ یا کالچر (Culture) تنظیم شده برای اونه. فرهنگ یه اسمبلی با یه رشته شامل دو قسمت با نام تگ (tag) که با یه کاراکتر "-" از هم جدا میشن معرفی میشه. مشخصات کامل این رشته خاص تو RFC 1766 توصیف شده. برای مثال fa-IR معرف فرهنگ «زبان فارسی ایرانی» است.
درحالت کلی اگه یه اسمبلی تنها حاوی کدهای یه برنامه باشه، نیازی به تعیین فرهنگ برای اون نیست. چون کدهای یه زبان برنامه نویسی باید مستقل از هر زبان و فرهنگ پیاده سازی بشن. به این اسمبلی ها که فقط حاوی کد هستند و هیچ فرهنگی برای اونا تعیین نشده، اصطلاحا culture neutral میگن.
اگه یه اسمبلی حاوی داده هایی حساس به فرهنگ باشه (مثل متن ها و رشته های نوشته شده با یه سری زبانهای خاص یا تصاویری وابسته به فرهنگ)، باید این داده ها رو با توجه به فرهنگ و زبانشون طبقه بندی کرده و هر کدوم رو تو یه اسمبلی جداگونه ذخیره کرد. برای این اسمبلی ها هم باید متناسب با داده هاشون، فرهنگ خاصی تنظیم کرد. به این اسمبلی های حاوی منابع وابسته به فرهنگ اصطلاحا satellite assmebly میگن. درضمن باید دقت بشه که تو این اسمبلی ها کدی وجود نداشته باشه، چون همونطور که اشاره شد کدهای برنامه نباید وابسته به یه فرهنگ خاص پیاده بشن. درواقع باید کدهای برنامه رو از این اسمبلی ها استخراج کرده و تو یه اسمبلی جداگونه ذخیره و کامپایل کرد.
برای تعیین فرهنگ یه اسمبلی میشه از سوییچ [c[ulture/ ابزار al.exe استفاده کرد. البته برای تعیین فرهنگ بدون استفاده از این ابزار هم میشه از attribute گلوبال AssemblyCulture تو کد برنامه استفاده کرد. هرچند روش دوم بدلیل اینکه برای اسمبلی هایی که حاوی کد هستند بکار میره، توصیه نمیشه.
نسخه اسمبلی تو ویژوال استودیو
هنگامیکه یه پروژه جدید تو ویژوال استودیو ایجاد میشه، یه فایل مخصوص به نام AssemblyInfo.cs هم به فولدر Properties پروژه اضافه میشه. مثل تصویر زیر:
Attributeهای گلوبال سطح اسمبلی برای تنظیم اطلاعات نسخه اسمبلی تو این فایل قرار میگیرن. این فایل هیچ فضای نام و یا کلاسی تعریف نمیکنه. با ایجاد یه پروژه جدید، یکسری از این attributeها با مقادیری پیش فرض به این فایل اضافه میشن. مثلا محتوای این فایل برای یه پروژه ConsoleApplication جدید تو ویژوال استودیو 2013 بصورت زیره:
using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("ConsoleApplication1")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("ConsoleApplication1")] [assembly: AssemblyCopyright("Copyright © 2014")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] // The following GUID is for the ID of the typelib if this project is exposed to COM [assembly: Guid("60295118-1a09-487d-8047-48660c7a3b49")] // Version information for an assembly consists of the following four values: // // Major Version // Minor Version // Build Number // Revision // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")]
با ویرایش این فایل و تنظیم مقادیر موردنظر میشه اطلاعات نسخه یه اسمبلی رو تغییر داد. البته ویژوال استودیو یه پنجره مخصوص برای تنظیم این اطلاعات فراهم کرده. این پنجره از طریق پنجره خواص پروژه (Propeties) و با کلیک رو دکمه ...Assembly Information مثل تصویر زیر، تو دسترسه: