X
تبلیغات
رایتل
به طور خلا‌صه در مورد عملکرد و کاربرد مونو می‌توان گفت که: مونو ابزاری برای کامپایل و ایجاد اسمبلی‌ها و برنامه‌های کاربردی نوشته شده با قابلیت‌های دات‌نت است و این امکان را می‌دهد تا یک کد یکتا بدون نیاز به بازنویسی یا کامپایل مجدد روی پلتفرم‌های مورد پشتیبانی (که در بالا‌ آمد) به راحتی و آسانی قابل اجرا باشد. می‌توان گفت که مونو عملکردی مشابه چهارچوب 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

آنچه برای کندوکاو بیشتر و پیشرفت در مونو نیاز داشتید را به دست آورید. دیگر لا‌زم نیست از ایجاد و توسعه ایده‌های ناب خود در دنیای مرموز و جذاب یونیکس/ لینوکس نگران باشید. شاید این قدمی کوچک، اما مؤثر در توسعه ابزارهای قوی و قابل اعتمادی چون لینوکس/ یونیکس باشد. امید آن‌که در آینده مقالا‌ت عمیق‌تر و فنی‌تری در این زمینه فراهم نماییم و در اختیار شما قرار خواهیم د