تو این مطلب کامپایل کد سی شارپ به کد IL با کامپایلر سی شارپ یا CSC (مخفف C# Compiler) و ساخت ماژول یا اسمبلی مدیریت شده (Managed Assembly) و ذخیره نتیجه تو یه فایل که قابلیت توزیع و انتشار داره، شرح داده میشه.
برای شروع کار قطعه کد زیر نمونه ساده و مناسبیه:
public sealed class Program { public static void Main() { System.Console.WriteLine("Building Managed Assembly"); } }
تو این قطعه کد، یه نوع (Type) به نام Program تعریف شده. این نوع یه متد استاتیک به نام Main داره که توش از نوع System.Console استفاده شده. این کلاس یه نوع تعریف شده توسط مایکروسافته که کد IL اون تو یه اسمبلی به نام MsCorLib.dll وجود داره. پس کد بالا یه نوع جدید تعریف کرده و توش از یه نوع دیگه که توسط یه شرکت دیگه تولید شده، استفاده شده.
استفاده از کامپایلر سی شارپ
کامپایلر #C سه نوع فایل مختلف تولید میکنه: فایل های اجرایی (exe.)، فایلهای کتابخونه ای (dll.) و فایلهای ماژول کد (netmodule.). تمامی سوییچهای این کامپایلر به دو فرمت option/ و option- قابل استفاده هستن.
برای کامپایل کد معرفی شده در بالا و تولید اسمبلی مدیریت شده متناظر، پس از ذخیره این کد تو یه فایل (ترجیحا با پسوند cs.) مثلا با نام Program.cs در ریشه درایو :d، از دستور زیر که باید تو یه خط فرمان مناسب اجرا بشه، میشه استفاده کرد:
این دستور به کامپایلر سی شارپ (csc.exe) میگه که یه فایل اجرایی با اسم Program.exe تولید بکنه (out:Program.exe/). نوع این فایل اجرایی هم باید یه برنامه کنسول ویندوزی باشه (t:exe/).
فایل اجرایی کامپایلر سی شارپ (csc.exe) معمولا تو همون مسیر نصب دات نت فریمورک (نسخه 32 بیتی: <windir%\Microsoft.Net\Framework\<version%) قرار داره. مثلا تو کامپیوتر من مسیر دقیق این فایل برای نسخه 64 بیتی اینه:
شرح و توصیف کامل نحوه استفاده از این ابزار (csc.exe) خودش یه مطلب مفصله. برای اطلاعات بیشتر میشه از این مقاله کامل کمک گرفت.
هنگامیکه کامپایلر #C فایل سورس کد بالا رو پردازش میکنه، میبینه که این کد از متد WriteLine نوع System.Console استفاده کرده. اینجا کامپایلر باید مطمئن بشه که این نوع تو یه جایی از سیستم جاری وجود داره، و یه متد به نام WriteLine هم داره، و همچنین آرگومانایی که به این متد تو این کد ارجاع داده شده با تعریف یا تعاریفی که متد مربوطه داره منطبقه.
اما از اونجایی که این نوع (System.Console در اینجا) تو سورس کد بالا تعریف نشده، بنابراین باید اسمبلی یا لیستی از اسمبلی های موردنیاز به کامپایلر معرفی بشه. اینکار همونطور که تو دستور بالا وجود داره با استفاده از سوییچ r/ یا reference/ انجام میشه. مثلا در اینجا r:mscorlib.dll/ که به کامپایلر میگه برای پیدا کردن نوع یا نوع های موردنیازی که تو سورس کد وجود ندارن میتونه تو اسمبلی MsCorLib.dll دنبالشون بگرده.
اسمبلی MsCorLib.dll یه اسمبلی ویژس که بسیاری از نوع های پایه ای و اساسی دات نت توش تعریف شدن. درواقع اینقدر این نوع ها تو دات نت استفاده میشن که کامپایلر سی شارپ بصورت پیش فرض از این اسمبلی برای انجام هر فرایند کامپایلی استفاده میکنه. به عبارت دیگه استفاده از دستور زیر (با حذف سوییچ r/) هم نتیجه مشابه ای با دستور بالا میده:
درضمن سوییچهای out/ و t/ (یا target/) در این دستور درست مطابق با مقادیر پیش فرض کامپایلر سی شارپ هستن، پس میشه اونا رو هم حذف کرد. بنابراین این دستور رو میشه بصورت زیر هم خلاصه کرد:
نتیجه اجرای این دستور تو تصاویر زیر نشون داده شده:
حالا این سوال ممکنه مطرح بشه که تو این فایل اجرایی تولید شده توسط کامپایلر (تو اینجا program.exe) دقیقا چه چیزی هست؟ بصورت خلاصه میشه گفت که این فایل یه فایل اجرایی (Portable Executable یا PE) استاندارده که قابلیت بارگذاری و اجرا تو سیستم عامل ویندوز (32 بیتی و 64 بیتی) رو داره. درحال حاضر سیستم عامل ویندوز توان اجرای مستقیم سه نوع اپلیکیشنی که کامپایلر سی شارپ تولید میکنه رو داره:
- اپلیکیشنهای کنسولی (Console Application) یا با رابط کاربری کنسولی (Console User Interface یا CUI) که با سوییچ t:exe/ (مقدار پیش فرض) تولید میشن.
- اپلیکیشن های با رابط کاربری گرافیکی (Graphical User Interface یا GUI) که با سوییچ t:winexe/ تولید میشن.
- اپلیکیشن های فروشگاه اپلیکیشنهای ویندوزی (Windows App Store) که با سوییچ t:appcontainerexe/ تولید میشن.
فایلهای Response
به عنوان یه تعریف کلی، فایل response فایلیه متنی، حاوی یکسری دستورات و تنظیمات مخصوص که برای اعمال برخی تنظیمات اولیه تو یه فرایند و خودکارسازی اون استفاده میشه. امروزه برنامه های گوناگونی از این فایلها استفاده میکنن. مثلا برنامه های نصاب یا installer اپلیکیشنهای بزرگ که فرایند نصب نسبتا پیچیده ای دارن از این فایلها برای نصب خودکار یا به اصطلاح silent یا unattended استفاده میکنن.
تو فرایند کامپایل کدهای سی شارپ، یه فایل response شامل مجموعه ای از سوییچهای خط فرمان کامپایلر سی شارپه. درصورت استفاده از این فایلها، کامپایلر از سوییچهای تعریف شده تو اونا استفاده میکنه، درست مثل حالتیکه از اون سوییچا تو خط فرمان بصورت مستقیم استفاده شده باشه.
برای معرفی یه فایل response به کامپایلر #C از کاراکتر @ در ابتدای نام و مسیر فایل response مربوطه استفاده میشه. برای مثال یه فایل response به نام WinApp.rsp حاوی سوییچهای زیر رو در نظر بگیرین که تو ریشه درایو :d قرار داره:
/target:winexe
برای استفاده از این فایل میشه از دستور زیر استفاده کرد:
واضحه که بکارگیری فایلهای response استفاده از خط فرمان کامپایلر سی شارپ رو خیلی ساده تر میکنه. مثلا کد تغییر یافته زیر رو در نظر بگیرین که تو فایل program.cs تو ریشه درایو :d ذخیره شده:
public sealed class Program { public static void Main() { Printer.Print("Building Managed Assembly with csc.exe"); } }
همچنین قطعه کد زیر که کلاس جدید Printer رو که در بالا ازش استفاده شده رو تعریف میکنه:
public sealed class Printer { public static void Print(string value) { System.Console.WriteLine("Print:{0}", value); } }
این کد تو یه فایل به نام printer.cs تو ریشه درایور :d ذخیره میشه. بعدش یه فایل resonse مثلا به نام program.rsp حاوی خطوط زیر تو ریشه درایور :d ایجاد میکنیم:
/out:d:\p.exe
/r:mscorlib.dll
d:\program.cs
d:\printer.cs
حالا با استفاده از دستور زیر کار کامپایل کد انجام میشه:
نتیجه اجرای این فرایند تو شکل زیر نشون داده شده:
فایل csc.rsp
کامپایلر #C امکان استفاده از چندین فایل response رو هم داره. درضمن علاوه بر فایلهای response معرفی شده تو خط فرمان، کامپایلر سی شارپ در زمان کامپایل بدنبال یه فایل response کلی به نام csc.rsp میگرده. این فایل باید دقیقا کنار خود فایل کامپایلر (csc.exe) باشه. تنظیمات کلی که نیازه تا تو تمامی فرایندهای کامپایل تو یه سیستم بکار بره رو میشه تو این فایل ذخیره کرد.
کامپایلر سی شارپ تو فرایندهای کامپایلی که از چندین فایل response استفاده میکنه، محتوای همه اونا رو با هم جمع میکنه. البته تو حالتی که تضاد یا conflict بین تنظیمات فایلهای response وجود داشته باشه، تنظیمات فایلهای response محلی جایگزین تنظیمات فایل کلی (csc.rsp) میشن و به همین ترتیب تنظیماتی که مستقیما تو خط فرمان آورده بشن اولویت بیشتری داشته و جایگزین تنظیمات فایلهای response میشن.
پس از نصب دات نت فریمورک یه فایل response کلی پیش فرض هم تو مسیر نصب دات نت فریمورک کنار فایل csc.exe نصب میکنه. مثلا محتوای این فایل تو سیستم من اینه:
# command line compiler (CSC) will process as part
# of every compilation, unless the "/noconfig" option
# is specified.
# Reference the common Framework libraries
/r:Accessibility.dll
/r:Microsoft.CSharp.dll
/r:System.Configuration.dll
/r:System.Configuration.Install.dll
/r:System.Core.dll
/r:System.Data.dll
/r:System.Data.DataSetExtensions.dll
/r:System.Data.Linq.dll
/r:System.Data.OracleClient.dll
/r:System.Deployment.dll
/r:System.Design.dll
/r:System.DirectoryServices.dll
/r:System.dll
/r:System.Drawing.Design.dll
/r:System.Drawing.dll
/r:System.EnterpriseServices.dll
/r:System.Management.dll
/r:System.Messaging.dll
/r:System.Runtime.Remoting.dll
/r:System.Runtime.Serialization.dll
/r:System.Runtime.Serialization.Formatters.Soap.dll
/r:System.Security.dll
/r:System.ServiceModel.dll
/r:System.ServiceModel.Web.dll
/r:System.ServiceProcess.dll
/r:System.Transactions.dll
/r:System.Web.dll
/r:System.Web.Extensions.Design.dll
/r:System.Web.Extensions.dll
/r:System.Web.Mobile.dll
/r:System.Web.RegularExpressions.dll
/r:System.Web.Services.dll
/r:System.Windows.Forms.Dll
/r:System.Workflow.Activities.dll
/r:System.Workflow.ComponentModel.dll
/r:System.Workflow.Runtime.dll
/r:System.Xml.dll
/r:System.Xml.Linq.dll
بنابراین با توجه به اینکه این فایل response کلی تمامی اسمبلی های نشون داده شده رو معرفی کرده، بنابراین تو کامپایل دستی برنامه ها نیازی به ریفرنس دوباره اونا تو خط فرمان نیست. و از اونجا که معرفی تک تک این اسمبلی ها میتونه کاری سخت و زمانبر باشه، استفاده از این فایل میتونه کمک بزرگی تو فرایند کامپایل باشه. درضمن اگه یه برنامه از اسمبلی های معرفی شده تو این فایل استفاده ای هم نکنه، وجود این سوییچها تاثیری تو فرایند کامپایل نخواهد گذاشت. پس در هر حالت استفاده از این فایل میتونه بسیار مفید باشه.
- فولدر کاری یا جاری برنامه در حال کامپایل (Working directory)
- فولدری که خود فایل csc.exe تو اون قرار داره. اسمبلی MsCorLib.dll همیشه از این مسیر (که مسیر نصب دات نت فریمورک مربوطه هم هست) بارگذاری میشه.
- هر فولدر یا مسیری که با سوییچ lib/ تو خط فرمان فراهم شده.
- هر مسیری که با Environment Variable یا متغیر محیطی LIB تو سیستم عامل معرفی شده.