Mono چيست؟
Mono پروژهاي است كه توسط شركت ناوِل (پيشتر توسط Ximian) براي ايجاد و توسعه ابزارهايي منطبق بر داتنت در دنياي اپنسورس رهبري ميشود. مونو قابليت اجرا روي لينوكس، FreeBSD ،UNIX ،Mac OSX و ويندوز را دارد و سكوهاي مورد پشتيباني آن همچنان در حال افزايشند. كامپايلر، #C و ابزارهاي آن در Mono تحت مجوز GPL، كتابخانههاي run time آن تحت LGPL و Class Libraryهاي آن تحت مجوز MIT عرضه ميگردند. نتيجه اينكه مونو يك نرمافزار منبعباز و مجاني است.
مونو همچنين حاوي يك موتور Just -in-Time) JIT) سازگار با پروسسورهاي
X86 ،SPARC ،PowerPC ،ARM ، S390 ،X86-64، IA64 و SPARC در حالت 64 بيتي است.
 |
|
شكل 1 |
به طور خلاصه در مورد عملكرد و كاربرد مونو ميتوان گفت كه: مونو ابزاري براي كامپايل و ايجاد اسمبليها و برنامههاي كاربردي نوشته شده با قابليتهاي داتنت است و اين امكان را ميدهد تا يك كد يكتا بدون نياز به بازنويسي يا كامپايل مجدد روي پلتفرمهاي مورد پشتيباني (كه در بالا آمد) به راحتي و آساني قابل اجرا باشد. ميتوان گفت كه مونو عملكردي مشابه چهارچوب Common Language Infrastructure) CLI) داتنت مايكروسافت دارد؛ با اين تفاوت كه مونو چهارچوبي كليتر و مجاني براي پلتفرمهاي گستردهتر فراهم ميكند.
با اينكه تعداد زيادي از برنامهنويسان و توسعهدهندگان نرمافزار در سطح جهان به ابزارهاي مبتني بر ويندوز و داتنت عادت كردهاند، زمان آن رسيده است بدانيد كه ميتوانيد اسمبليهاي داتنت را روي سكوهاي Mac OSX ،Solaris ،AIX و تعداد زيادي از لينوكسها كامپايل و اجرا كنيد. در حالي كه Cross-Platform (يا استقلال نسبت به سكوي كاري) بودن اين چارچوب كاري (يعني مونو) به برنامههايي از قبيل Hello World محدود نشده است و ميتوانيد به آساني با مونو، اسمبليهاي آماده توليد مبتني بر ADO.NET، فرمهاي ويندوز، ASP.NET و ... را ايجاد و اجرا كنيد.
نصب Mono
براي شروع كار در ويندوز، بايد نسخه مخصوص ويندوز MONO را دانلود و نصب نماييد. پس از دريافت فايل Mono Installer for Windows آن را اجرا كنيد و پروسه نصب را پي بگيريد. توجه داشته باشيد كه Mono هيچ تداخلي با Microsoft.NET يا MS Visual Studio از قبل نصب شده نخواهد داشت.
در زمان تهيه اين مقاله، بهترين و آخرين نسخه عرضه شده مونو، 1.15 است. اگر بعد از نصب به دايركتوري اين نسخه از مونو مراجعه كنيد، با تعداد زيادي از زير پوشهها از جمله etc ،contrib ،man ،share و ... مواجه خواهيد شد. (كه براي كاربران لينوكس آشناست) (شكل 1). شكل 1 ساختار پوشه مونو را نشان ميدهد.
در اين مقاله فقط با فولدرهاي bin/ (كه حاوي بسياري از ابزارهاي مونو از جمله كامپايلر #C)،
Global Asscmbly Cache: GAC lib\mono\gac چارچوب كاري مونو) سروكار خواهيم داشت.
چون اكثر ابزارهاي مونو را از دايركتوري bin\ و از طريق خط فرمان اجرا خواهيد كرد، لذا بهتر است آدرس آن را به متغير محيطي Path سيستمعامل خود اضافه كنيد. براي سهولت در كار، ميتوانيد از خط فرمان MONO استفاده كنيد. اين ابزار ميتواند به طور خودكار ابزارهاي خط فرماني را شناسايي كند وآنها را به كار گيرد. آدرس اين كنسول: Start>All Program >Mono For Windows> Applications حال براي اطمينان از صحت نصب، فرمان زير را وارد كنيد:
mono-- version
اگر همه كارها به درستي انجام شده باشد، جزئيات بسياري مطابق آنچه در تصوير شماره 2 نشان داده شده است، نمايش داده خواهد شد.
 |
|
شكل 2 |
 |
|
فهرست 1 |
كامپايلرهاي Mono
مونو، همانند توزيع CLI مايكروسافت، حاوي تعدادي كامپايلر مديريت شده است. اين كامپايلر عبارتند از:
● كامپايلرهاي #mcs.exe : C و gmcs
●كامپايلر BASIC مونو: mbas.exe
●كامپايلر زبان booc.exe :Boo
●كامپايلرهاي CIL مونو: IIasm.exe, ilasm.exe
در اين مقاله فقط از كامپايلرهاي #C استفاده خواهيم كرد، اما در مورد كامپايلر بيسيك مونو بايد گفت كه يك مجموعه كامل و غني از Visual Basic.NET است كه با هدف ايجاد و توسعه يك زبان برنامهنويسيِ به آساني قابل فهم براي آنان در دنياي لينوكس / يونيكس و Mas OSX عرضه شده است و همچنان در حال توسعه و بازبيني قرار دارد. Boo نيز يك زبان شيءگرا از نوع ايستا است كه بر مبناي Python نوشته شده است. براي آشنايي بيشتر با اين كامپايلر به اين سايت مراجعه كنيد. llasm.exe و ilasm.exe نيز كامپايلرهاي CIL مونو هستند كه دومي از ساختارهاي زباني NET 2.0 پشتيباني مينمايد.
كار با كامپايلرهاي #C
mcs.exe اولين #C بود كه براي پروژه مونو در نظر گرفته شد. اين كامپايلر با 1.1#C مطابقت كامل دارد (در حقيقتmcs.exe با #C نوشته شده است) و همانند كامپايلر خط فرمان مايكروسافت يعني (csc.exe) از response fileها پشتيباني ميكند. يعني كه ميتوانيد با اضافه كردن فلگهاي /target ،/out ،/reference و ... به ترتيب نوع اسمبلي، نام اسمبلي كامپايل شده و وابستگيهاي خارجي فهرست اسمبلي را براي كامپايلر تعيين كنيد. ميتوانيد تمام آپشنهاي قابل استفاده در mcs.exe را با دستور زير مرور كنيد:
؟- mcs.exe
gmcs.exe يا(genericmcs.exe) نسخهاي از mcs.exe است كه از #C مخصوص NET 2.0 و ارجاعهاي كتابخانههاي پايهاي كلاس مبتني بر NET 2.0 پشتيباني ميكند. در حقيقت تفاوت اين دو كامپايلر در اينجاست كه mcs.exe به طور خودكار به Base Class Libraryهاي مبتني بر NET 1.1 مراجعه ميكند، در صورتي كه gmcs.exe به طور پيشفرض از Base Class Libraryهاي مبتني بر NET 2.0 به عنوان مرجع استفاده مينمايد. با اين حساب،gmcs.exe در آينده كامپايلر پيشفرض مونو خواهد شد و mcs.exe از دور خارج خواهد گرديد.
ايجاد يك Code Library داتنت با Mono
براي آشنايي با مونو در عمل، از ايجاد يك كتابخانه كه با نام Core LibDump.dll شروع ميكنيم. اين اسمبلي حاوي يك نوعِ تك كلاسه با نام CoreLib Dumper و داراي يك متد استاتيك با نام DumpTypeTo File است. اين متد يك رشته كه معرف يك نام معتبر از يك Type موجود درون mscorlib.dll را ميگيرد و اطلاعات مرتبط با آن Type را به يك فايل محلي در هاردديسك منتقل ميكند كه كامل اين برنامه در فهرست 1 آمده است. براي مثال، اگر پارامتر رشتهاي ورودي به اين متد System.Threading.Thread باشد، فايل خروجي System.Threading.Thread.txt نام خواهد داشت. با اينكه ميتوانيد اين برنامه را با واردكردن آرگومانهاي تعريفي به صورت مجزا كامپايل كنيد، اينكار با استفاده از فايلهاي response سادهتر و راحتتر انجام ميپذيرد. براي اين كار، فايلي را با نامCorelibDumper.rsp در كنار فايل CoreLibDumper.cs ايجاد نماييد و مجموعه فرامين زير را در آن وارد كنيد:
target: library/
out: CorelibDumper.dll/
CoreLibDumper.cs
حال ميتوانيد كتابخانه مذكور را با دستور زير كامپايل كنيد:
gmcs @corelibDumper.rsp
البته بدون فايلهاي rsp.* بايد كامپايل را اينگونه انجام ميداديد:
gmcs/target: library out:Corelib/.Dumper.dll
Corelib Dumper.cs
تخصيص يك نام قوي به CoreLib Dumper.dll
مونو از ايجاد اسمبليهاي نام قوي و به اشتراكگذاري شده در Global Assembly Cache) GAC) نيز پشتيباني ميكند. يعني ميتوان كتابخانهاي را كه ايجاد كردهايد، در GAC به صورت فراگير به اشتراك بگذاريد. براي ايجاد دادههاي كليدي public/private، مونو از sn.exe (كه كم و بيش مثل محصول مايكروسافتي هم نام خود عمل ميكند) استفاده مينمايد. براي مثال، دستور زير يك فايل snk.* ايجاد ميكند: (براي كسب اطلاعات بيشتر از فلگ ؟ - در پايان فرمان استفاده كنيد).
sn/ k myTest KeyPair.snk
حال براي اينكه به #C بگوييم از اين كليد ايجادشده براي تخصيص يك نام قوي به كتابخانه CoreLibDumper.dll استفاده كند، بايد فايل CoreLibDumper.rsp را به صورت زير درآوريد:
target: library/
out: CoreLibDumper.dll/
Keyfile: myTest KeyPair.snk/
CoreLibDumper.cs
حال با فرمان زير، كتابخانه خود را دوباره كامپايل ميكنيم:
gmcs @corelibDumper.rsp
مشاهده فهرست بروزرسانيشده با monodis.exe
قبل از قرار دادن اسمبلي در GAC، در مورد monodis.exe (كه عملكردي مشابه ildasm.exe مايكروسافت دارد) بدانيد كه ميتوانيد با استفاده از آن، كُد CIL، فهرست كلي و انواع metadata براي يك اسمبلي مشخص را مشاهده كنيد.
مثلاً ميخواهيم اطلاعات مربوط به اسمبلي نام قويِ جديدي كه ايجاد كردهايم را با سوييچ assembly مشاهده كنيم. شكل 3 پاسخ به دستور زير را نشان ميدهد:
monodis-- assembly CoreLibDumper.dll
همانطور كه ميبينيد، فهرست كلي اسمبلي، حاوي كليدي كه در myTest keypair.snk ايجاد كرديم نيز ميباشد.
 |
|
شكل 3 |
|

|
|
شكل 4 |
نصب اسمبليها در GAC
حال كه يك كتابخانه strong-name ايجاد كردهايم، بايد آن را توسط ابزار gacutil.exe در GAC نصب كنيم. همانند ابزار مشابه مايكروسافتي كه به همين نام عرضه شده است، gacutil.exe براي نصب، uninstall و مرور اسمبليهاي ساخته شده كاربر در GAC مورد استفاده قرار ميگيرد. (توجه كنيد كه GAC در دايركتوري
ProgramFiles\Mono\lib\mono\gac\... قرار دارد).
دستور زير CoreLib Dumper.dll را به صورت يك اسمبلي به اشتراكگذاري شده در ماشين محلي در Global Assembly Cache نصب ميكند. (از خط فرمان مونو براي اينكار استفاده كنيد):
gacutil- i CoreLibDumper.dll
حال بايد بتوانيد يك پوشه جديد با نام CoreLibDumper در پوشه gac \...(مسير اصلي اين پوشه در بالا ذكر شد) ببينيد. شكل 4 اين پوشه را در فولدر GAC نمايش ميدهد.
ايجاد يك Console Application با مونو
بياييد يك كلاينت ساده كه آن را ConsoleClientApp.exe خواهيم ناميد ايجاد كنيم. يك فايل جديد با نامConsoleClientApp.cs بسازيد و كد آورده شده در فهرست 2 را در آن وارد كنيد.
 |
|
فهرست 2 |
دقت كنيد كه متد () main از كاربر نام يك نوعِ كاملاً تعريف شده را درخواست خواهد كرد. متد ()TypeDumper.DumpTypetofile نيز از نام وارد شده توسط كاربر براي بازيابي Type و ارسال اطلاعات آن به يك فايل متني استفاده ميكند. حال يك فايل ConsoleClient App.rsp ايجاد نماييد و كد زير را در آن وارد كنيد: (اين فايل به Corelib Dumper.dll رجوع خواهد كرد.)
target: exe/
out: Console ClientApp.exe/
reference: CoreLibDumper.dll/
ConsoleClientApp.cs
حال براي ايجاد فايل اجرايي، كد بالا را با دستور ذيل كامپايل ميكنيم:
gmcs @consoleClinetApp.rsp
قبل از اجراي اين برنامه، فايل CoreLibDumper.dll را كه در دايركتوري جاري فايل اجرايي كامپايل شده قرار دارد، به DontuseCoreLibDumper.dll تغييرنام دهيد. دليل اين كار اين است كه شما اسمبلي خود را در GAC نصب كردهايد و در صورت رجوع به آن در طي اجراي برنامه، از كپي نصب شده در GAC استفاده خواهيد كرد، نه نسخه محلي كتابخانه CoreLibDumper.dll.
پس از انجام مراحل بالا، حالا ميتوانيم ConsoleClientApp.exe را در موتور زمان اجراي Mono با دستور زير اجرا كنيم:
Mono ConsoleClientApp.exe
اكنون، براي مثال System.Threading.Thread را وارد كنيد. برنامه، Type مورد نظر را جستوجو مينمايد و در نهايت يك فايل با نام System.Threading.Thread.tex ايجاد خواهد كرد كه حاوي تعريفهاي metadata اين نوع خواهد بود. شكل 5 محتويات فايل مذكور را نشان ميدهد.
 |
|
شكل 5 |
قبل از آنكه به ايجاد برنامههاي كاربردي مبتني بر فرمهاي ويندوز بپردازيم، اين آزمايش را انجام دهيد: با استفاده ازWindows Explorer، پوشه كاري خود را باز نماييد و سعي كنيد با دوبار كليك روي فايل ConsoleClientApp.exe، آن را اجرا كنيد. همان طور كه ميبينيد، اين كار باعث رخ دادن FileNotFoundExeption خواهد شد. ممكن است تصور كنيد اين اتفاق به دليل تغيير نام CoreLibDumper.dll افتاده است. اما بايد بدانيد كه دليل اصلي آن است كه با دوبار كليك روي اين فايل، آن را از طريق Microsoft CLR اجرا خواهيد كرد.
به ياد داشته باشيد كه براي اجراي برنامهها تحت مونو، بايد آنها را توسط Mono.exe اجرا نماييد. در غير اينصورت، برنامه كاربردي از طريق Microsoft CLR (كه از اسمبليهاي اشتراكي نصبشده در Microsoft GAC و واقع در دايركتوري Assembly\ استفاده ميكند) اجرا خواهد گرديد. در مواردي خاص ممكن است برنامه بدون مشكل اجرا گردد. در اين حالت فقط ميتوانيد از اسمبليهاي NET. استفاده نماييد و در صورت رجوع به كتابخانههاي ايجاد شده توسط خودتان، با FileNotFoundExeption مواجه خواهيد شد.
ايجاد يك برنامه كاربردي بر مبناي فرمهاي ويندوز
قبل از ادامه كار، DontuseCoteLibDumper.dll را به همان نام قبلي يا CoreLibDumper.dll تغيير نام دهيد. سپس يك فايل جديد #C ايجاد نماييد و آن را WinFormsClientApp.cs بناميد.
در اين فايل دو type با استفاده از قابليتهاي 2.0 #C تعريف شده و چند كلاس ايستا به همراه متدهاي ناشناس به كار رفتهاند كه در فهرست 3 موجود است.
 |
|
فهرست 3 |
باز هم مثل قبل، پيش از كامپايل يك فايل rsp.* با نام WinFormsClientApp.rsp ايجاد نماييد و فرامين زير را در آن وارد كنيد:
target: winexe/
out: WinFormsClientApp.exe/
reference: CoreLibDumper.dll/
reference: System.Windiws.Forms.dll/
reference: System.Drawing.dll/
WinFormsClientApp.cs
حال با فرمان زير، پروژه را كامپايل كنيد:
gmcs @winformsClientApp.rsp
در صورتي كه برنامه كامپايل شده را با mono.exe اجرا كنيد، چيزي مشابه شكل 6 مشاهده خواهيد كرد.
 |
|
شكل 6 |
جمعبندي
تا اينجا چيز جديدي در مورد NET. يا #C مطرح نشد و تأكيد ما در اين مقاله طرز شروع كار با مونو بود. با اينكه در طي اين مقاله چند برنامه كاربردي ساده با مونو ايجاد كرديم، اما اهميت مونو در جايي واضحتر ميشود كه به شكل 7 دقت كنيد. اين تصوير همان برنامه مبتني بر Windows Forms را در حال اجرا در لينوكس Suse نمايش ميدهد.
 |
|
شكل 7 |
نتيجه اينكه ميتوانيد دقيقاً همان كد #C كه در اين مقاله با آن آشنا شديد را در لينوكس (يا هر سيستمعاملي كه توسط مونو پشتيباني ميشود) به راحتي كامپايل يا اجرا كنيد. در حقيقت، ميتوانيد اسمبليهايتان (كه فرضاً در Win 32 ايجاد شدهاند) را به يك سيستمعامل جديد كپي نماييد و آنها را مستقيماً و بدون نياز به كامپايل مجدد يا ايجاد تغييرات در كد، اجرا كنيد. تنها كار لازم، استفاده از mono.exe است.
براي آشنايي بيشتر با مونو و افزيش تواناييهاي خود در اين زمينه، ميتوانيد به راهنمايِ همراه مونو كه Mono Doc خوانده ميشود، مراجعه كنيد. اين راهنما، حاوي اطلاعات مفيدي در مورد كتابخانههاي پايهاي كلاس مونو و زبان برنامهنويسي #C است. اين ابزار از طريق Start < All Programs < Mono for Windows< Applications قابل دسترسي است.
شكل 8 نمايي از Mono Doc را نمايش ميدهد. البته در طي گشتوگذار در طي Mono Doc با مدخلهاي ناكامل زيادي روبهرو خواهيد شد؛ چراكه راهنماهاي كلاسهاي پايهاي مونو توسط Community مونو تهيه شده و در حقيقت شما نيز ميتوانيد در تهيه و توسعه اين راهنما سهيم باشيد.
 |
|
شكل 8 |
آنچه براي كندوكاو بيشتر و پيشرفت در مونو نياز داشتيد را به دست آوريد. ديگر لازم نيست از ايجاد و توسعه ايدههاي ناب خود در دنياي مرموز و جذاب يونيكس/ لينوكس نگران باشيد. شايد اين قدمي كوچك، اما مؤثر در توسعه ابزارهاي قوي و قابل اعتمادي چون لينوكس/ يونيكس باشد. اميد آنكه در آينده مقالات عميقتر و فنيتري در اين زمينه فراهم نماييم و در اختيار شما قرار خواهيم دهيم.