CLR, BCL, CIL, and assemblies در .Net

CLR, BCL, CIL, and assemblies در .Net

قبل از شروع بیاید نگاهی به FCL یا Framework Class Library بندازیم که در آن میتونید بسیاری از کلاس ها، عملکردها یا functionality و سایر سرویس ها را ببینید. این مقاله BCL  و CLR رو توضیح میده.

Framework Class Library(FCL)

مقدمه ای به ساخت بلاک های پلتفورم دات نت (clr, cts, cls)

حالا که شما برخی از مزایای اراي هشده توسط دات نت رو فهمیدید قصد درام سه موضوع کلیدی که به شما در فهم بهتر این مزایا کمک میکند رو توضیح بدم

CLR یا Common Language Runtime

از دیدگاه یک برنامه نویس، دات نت یک محیط زمان اجرا و یک کتابخانه کلاس پایه جامع است. runtime به عنوان Common language runtime (CLR) نامیده می شود. هدف اصلی CLR بارگذاری، جاگذاری و مدیریت اشیاء دات نت از طرف برنامه نویس است. این بدان معناست که CLR همیشه این عملیات را انجام می دهد و برنامه نویس در این فرآیندها دخالت نمی کند. همچنین، CLR از مدیریت حافظه، میزبانی برنامه، برخی بررسی های امنیتی و هماهنگی تردها مراقبت می کند.

CTS یا Common Type System

CTS تمام انواع داده ها و تمام ساختارهای مرتبط پشتیبانی شده توسط runtime، جزئیات نحوه نمایش آنها در فرمت metadata دات نت را توضیح می دهد و همچنین نحوه تعامل موجودیت ها با یکدیگر را مشخص می کند. به عبارت دیگر، ما چندین زبان داریم و هر زبانی تعریف نوع داده خاص خود را دارد و برای زبان های دیگر قابل درک نیست، اما CLR می تواند تمام انواع داده ها را درک کند.

به عنوان مثال، CSharp دارای نوع داده int و VB.NET دارای نوع داده Integer است. بنابراین پس از کامپایل، از همان ساختار Int32 در CTS استفاده می کند.

Common Language Runtime (CLR)

CLS یا Common Language Specification

CLS زیرمجموعه‌ای از CTS است، مجموعه‌ای از قوانین و محدودیت‌هایی را تعریف می‌کند که هر زبان باید از آنها پیروی کند که تحت چارچوب.NET اجرا می‌شوند.

به عنوان مثال تصور کنید برنامه ای را با C# و VB.NET توسعه می دهید، در سی شارپ هر عبارت باید با یک نقطه ویرگول خاتمه یابد، اما در VB.NET نباید اینطور نوشته شود.

بنابراین این قواعد نحوی از زبانی به زبان دیگر متفاوت است اما CLR می تواند سینتکس تمام زبان ها را درک کند زیرا در دات نت هر زبان پس از کامپایل به کد MSIL تبدیل می شود و کد MSIL مشخصات زبان CLR است.

BCL یا Base Class Library

با نام Class Library (CL) نیز شناخته می شود. BCL زیرمجموعه ای از Framework class library (FCL) است. کتابخانه کلاس مجموعه ای از انواع قابل استفاده مجدد است که با CLR ادغام شده اند. BCL کلاس ها و انواعی را ارائه می دهد که در انجام عملیات روزانه مفید هستند، به عنوان مثال. سر و کار با string و primitive types، اتصال پایگاه داده و عملیات IO.

BCL انواعی را تعریف می کند که می توان از آنها برای ساخت هر نوع برنامه نرم افزاری استفاده کرد.

می توانید از ASP.NET برای ساخت وب سایت ها و خدمات REST،  از WCF برای ساخت سیستم های توزیع شده، از WPF برای ساخت برنامه های رابط کاربری گرافیکی دسکتاپ و غیره استفاده کنید. همچنین، BCL انواعی را برای تعامل با دایرکتوری و سیستم فایل در یک کامپیوتر معین، ارتباط با پایگاه های داده رابطه ای (از طریق ADO.NET) و غیره ارائه می دهد.

Base Class Library (BCL)

کد مدیریت شده و مدیریت نشده

اکنون که با تعریف BCL و CLR آشنا شدید، در مورد کدهای مدیریت شده و مدیریت نشده صحبت خواهم کرد.

زبان سی شارپ را فقط می توان برای ساختن نرم افزاری استفاده کرد که تحت Dotnet Runtime میزبانی می شود. اصطلاحی که برای توصیف کدی که dotnet runtime را هدف قرار می دهد، کد مدیریت شده است. یک واحد باینری وجود دارد که حاوی کد مدیریت شده است که اسمبلی نامیده می شود. در مقابل، کدهایی که نمی توانند مستقیماً توسط dotnet runtime میزبانی شوند، کد مدیریت نشده نامیده می شوند.

همانطور که در مقاله قبلی اشاره کردم، پلت فرم دات نت می تواند بر روی انواع سیستم عامل ها اجرا شود. می توان یک برنامه C# بر روی سیستم عامل ویندوز با استفاده از ویژوال استودیو ساخت و برنامه را بر روی یک ماشین macOS با استفاده از زمان اجرا NET Core اجرا کرد. . همچنین می توانید با استفاده از Xamarin Studio یک اپلیکیشن سی شارپ بر روی سیستم عامل لینوکس بسازید و برنامه را روی ویندوز، macOS و ... اجرا کنید. با آخرین نسخه ویژوال استودیو، منظورم ویژوال استودیو 2017 است، شما همچنین می توانید برنامه های دات نت Core را روی مک بسازید تا در ویندوز، macOS یا لینوکس اجرا شوند. امکان ساخت، استقرار و اجرای برنامه های دات نت بر روی سیستم های عامل مختلف وجود دارد.

مروری بر اسمبلی های دات نت

صرف نظر از اینکه کدام زبان دات نت را برای توسعه انتخاب کرده اید، پس از کامپایل برنامه شما دو نوع اسمبلی وجود خواهد داشت، Executing files *.exe و Dynamic Link Library *.dll.

اما وقتی برنامه دات نت خود را کامپایل می کنیم، به کد باینری اجرایی تبدیل نمی شود، بلکه به یک کد میانی به نام MSIL یا IL تبدیل می شود که توسط CLR قابل درک است. MSIL یک کد مستقل از سیستم عامل و H/W است. زمانی که برنامه باید اجرا شود، این کد MSIL یا میانی به کد اجرایی باینری تبدیل می شود که به آن کد بومی یا native می گویند.

همه اسمبلی های دات‌نت شامل تعریف انواع، اطلاعات نسخه‌سازی برای نوع metadata و manifest هستند.

اگر کلاسی به نام Customer دارید، نوع metadata جزئیاتی مانند کلاس پایه customer را توصیف می‌کند، مشخص می‌کند کدام interface ها توسط کلاس مشتری پیاده‌سازی می‌شوند، و همچنین اطلاعاتی درباره هر عضو در کلاس مشتری ارائه می‌دهد.dotnet metadata همیشه در یک اسمبلی وجود دارد و وظیفه دات نت است که به صورت خودکار آن را تولید کند.

متادیتای CIL و type، خود اسمبلی ها نیز با استفاده از metadata توصیف می‌شوند که به آن مانیفست می‌گویند. مانیفست حاوی اطلاعاتی در مورد نسخه فعلی اسمبلی و لیستی از همه مجموعه‌های ارجاع شده خارجی است که برای اجرای صحیح لازم هستند.

نقش CIL در دات نت

برای درک نقش CIL به کد سی شارپ زیر که یک ماشین حساب را مدل می کند نگاهی بیندازید.

using System;

namespace Calculator
{

    class Program
    {
        static void Main(string[] args)
        {
            Calc cl = new Calc();
            Console.WriteLine("13+31={0}", cl.AddNumbers(13, 31));
            Console.ReadLine();
        }
    }
      
    class Calc
    {
        public int AddNumbers(int x, int y)
        {
            return x + y;
        }
    }
}

همانطور که می بینید ما دو کلاس داریم،

  • program: که نقطه ورود برنامه است
  • Calc: که دارای متدی به نام Addnumbers و جمع دو عدد است و نتیجه جمع اعداد را برمی گرداند.

پس از کامپایل کردن برنامه با استفاده از کامپایلر سی شارپ (Calculator.exe)، در نهایت با یک فایل *.exe که حاوی یک مانیفست، متادیتا و دستورالعمل های CIL است، مواجه می شوید.

حالا بیایید از ildasm.exe برای بررسی فایل Calculator.exe خود استفاده کنیم.

اگر می خواهید از این ابزار در ویژوال استودیو استفاده کنید، این مراحل را دنبال کنید و آن را به ابزارهای ویژوال استودیو اضافه کنید.

  • ابتدا مکان ildasm.exe را پیدا کنید. معمولا در مسیر زیر
    • C:\Program Files (x86)\Microsoft SDKs\Windows\[Windows Version]\Bin\ildasm.exe
  • ویژوال استودیو را باز کنید
  • از منوی Tools بخش External tools را باز کنید و سپس باید کادر گفتگوی External Tools را ببینید.

  • روی دکمه افزودن کلیک کنید، عنوان ابزار خود را انتخاب کنید (ILDASM )، در کادر متنی Command مسیر ildasm.exe را وارد کنید و در جعبه متن Argument فقط روی دکمه فلش سمت راست کلیک کنید و $(TargetPath) را انتخاب کنید.
  • Close و Exit را علامت بزنید.
  • همین، تمام شد.

ildasm.exe چه چیزی ارائه می دهد؟

ildasm سه چیز اساسی را به شما نشان خواهد داد،

  • لیستی از تمام کلاس ها و متدها در اسمبلی شما
  • محتویات مانیفست assembly
  • کد IL برای هر روش پیاده سازی شده در اسمبلی.

برای باز کردن اسمبلی مربوطه فقط به منوی tools بروید و در اینجا  ILDASM در این منو ظاهر می شود، فقط آن را باز کنید.

بنابراین، اگر می‌خواهید اطلاعاتی در مورد برنامه خود پیدا کنید، ildasm را در منوی Tools باز کنید و کادر ildasm.exe را مشاهده خواهید کرد. همانطور که می بینید اطلاعاتی در مورد نوع اسمبلی، مانیفست و metadata وجود دارد.

اگر Calculator.Calc را باز کنیم، متد AddNumbers وجود دارد. با دوبار کلیک کردن روی متد می توانم اطلاعات مربوط به این متدرا در پنجره جدیدی ببینم.

به نوع داده int32 توجه کنید، همانطور که به یاد دارید در اوایل این مقاله در مورد CTS  صحبت کردم که در آن همه انواع داده ها پس از کامپایل برای CTS قابل درک هستند. int در C# یا Integer در VB به صورت int32 در CTS کامپایل می‌شود.

بنابراین همانطور که می بینید متد AddNumbers با استفاده از CIL مانند تصویر بالا نشان داده شده است.

مزایای CIL

اکنون متوجه شدید که CIL دقیقاً چه کاری انجام می دهد، چرا لازم است کد خود را در CIL کامپایل کنید؟ آیا به یاد دارید همانطور که گفتم می توانید از زبان های مختلفی در دات نت استفاده کنید. شما در پروژه خود از یک یا شاید دو و غیره استفاده می کنید، در پایان همه آنها در CIL کامپایل می شوند و همه زبان ها در یک عرصه باینری کاملاً تعریف شده با هم تعامل خواهند داشت.

نقش DotNet type Metadata

اسمبلی دات نت شامل metadata های کامل و دقیق مانند کلاس، structure و همچنین اعضای هر نوع مانند property ها، متدها و غیره است. پس چگونه این اطلاعات استخراج می شود؟ توسط برنامه نویس یا کامپایلر؟ خوشبختانه همه این کارها توسط کامپایلر انجام شود نه برنامه نویس.

برای نشان دادن فرمت metadata به شما، بیایید نگاهی به metadata پروژه خود بیاندازیم که توسط متد AddNumbers ایجاد شده است. برای انجام این کار، به سادگی ideas را در منوی Tools خود باز کنید و پس از باز شدن کادر dialog، کافیست ctl+m را فشار دهید تا نوع metadata پروژه شما نشان داده شود.

اگر ctl+m را فشار دادید و سپس کادر محاوره‌ای ظاهر نشد، مطمئن شوید که نسخه مناسب ildasm را باز کرده‌اید. اگر پروژه شما توسط .Net Framework نسخه 4.6.1 ایجاد شده است و ildasm را با .NET Framework نسخه 4.5.1 باز می‌کنید، کادر محاوره‌ای خود را باز کنید. پس از استفاده از ctl+m ظاهر نمی شود.

همانطور که در تصویر بالا می بینید، ما یک TypeDef #2 داریم که اطلاعاتی در مورد پروژه ارائه می دهد، برای مثال TypeDefName به کلاس Calc در پروژه Calculator اشاره دارد و همچنین دو روش در کلاس Calc وجود دارد.

  • AddNumbers
  • که دو پارامتر x و y را می گیرد
  • .ctor که سازنده پیش فرض کلاس Calc است و به طور خودکار توسط دات نت تولید می شود.

نقش Assembly Manifest

اسمبلی .Net که حاوی Metadata است که خود اسمبلی را توصیف می کند، همانطور که قبلاً اشاره کردم Manifest نامیده می شود.

Manifest تمام اطلاعات اسمبلی های خارجی مانند شماره نسخه اسمبلی، اطلاعات copyright و غیره را مستند می کند. بنابراین وظیفه کامپایلر است که مانیفست اسمبلی را به جای برنامه نویس تولید کند.

منبع: 

https://medium.com/@v.cheshmy/clr-bcl-cil-and-assemblies-in-net-framework-3de8bf09e781

 

اشتراک گذاری