پرسش و پاسخ پیرامون NET CLR.

سه شنبه 15 تیر 1395

در این مقاله به بررسی متداول ترین پرسش هایی که در زمینه کار با Net Framework. وجود دارد می پردازیم . همچنین مثالهایی در هر موضوع برای درک بهتر مطالب آورده شده است.

پرسش و پاسخ پیرامون NET CLR.

پرسش 1- .NET Framework چیست؟

پاسخ :

NET Framework. یک کلاس شامل تعداد زیادی کتابخانه است که قابلیت استفاده ی مجدد دارند.(تنها به یک بار استفاده محدود نیستند.) این کلاس توسط شرکت Microsoft  ارائه شده است و کاربران می توانند آن را در  توسعه برنامه های مختلف مبتنی بر .Net استفاده کنند. از این کلاس  برای ساخت و ارتقای برنامه ها در پلتفرم ویندوز و سایر پلتفرم ها می توان استفاده کرد،  پلتفرم هایی که در حال حاضر دارای این قابلیت هستند عبارتند از :

1-برنامه های کنسول (  Console Application)

2-برنامه های ویندوز فرم

3-برنامه های Windows Presentation Foundation (WPF)

4-برنامه های مبتنی بر وب(Web Application)

5-وب سرویس ها

6-برنامه های سرویس گرا  با استفاده از Windows Communications Foundation (WCF)

7-برنامه های Workflow-enabled با استفاده از Windows Workflow Foundation(WF)

اساسا همه ی این برنامه ها بر روی سیستم عامل Microsoft Windows کار می کنند.

پرسش 2:   CLRچیست؟

 پاسخ:

واژه ی CLR کوتاه شده ی عبارت Common Language Runtime است که بیانگر یک محیط اجرایی برای برنامه ها است و به عنوان یک لایه بین سیستم عامل و برنامه های نوشته شده با زبان های تحت .Net عمل می کند و از Common Language Specification (CLS) نیز پشتیبانی می کند. کار اصلی Common Language Runtime (CLR) تبدیل کدهای مدیریت شده به کدهای خام و اصلی و سپس اجرای برنامه است . ویژگی کامپایل just in time (JIT) زبان سطح متوسط (MSIL) را در زمان اجرا و در صورت نیاز به کدهای خام و اصلی تبدیل می کند.

وقتی برنامه .Net به حالت اجرا می رود، control به سیستم عامل می رود سپس سیستم عامل یک فرآیند برای بارگذاری CLR ایجاد می کند.

برنامه ای که توسط سیستم عامل برای بارگذاری CLR استفاده می شود، runtime host نامیده می شود. نوع این برنامه می تواند بر اساس ویندوز و یا وب بودن برنامه اصلی تغییر کند.

runtime host برای برنامه های مبتنی بر دسکتاپ تابع API ای به نام CorbinToRuntime است. runtime host برای برنامه های مبتنی بر وب ، asp.net worker process است .( aspnet-wp.exe)

موتور CLR runtime با مجموعه ای از سرویس ها در دسترس کاربران قرار می گیرد. این سرویس ها به صورت زیر طبقه بندی شده اند:

سرویس های CLR

Assembly Resolver

Assembly Loader

Type Checker

COM marshaller

Debug Manager

Thread Support

IL to Native compiler

Exception Manager

Garbage Collector

پرسش 3 : CTS  چیست؟

پاسخ:

Common Type System (CTS) نوع داده های همه ی زبان های برنامه نویسی را با استفاده از .NET به یک نوع ساده و قابل استفاده بین همه ی زبان های موجود تبدیل می کند.

برای اطلاع از نحوه ی کار CTS می توانیم اینطور مثال بزنیم که "وقتی ما یک داده از نوع int  در  C# و یا VB.NET تعریف می کنیم ، به int32 تبدیل می شوند. به عبارت دیگر حالا هر دو تای آن ها دارای یک نوع متداول هستند که همین موضوع امکان ایجاد یک ارتباط مناسب بین دو زبان را به ما می دهد.

پرسش 4 : CLS چیست؟

پاسخ :

یکی از مهم ترین اهداف .NET Framework ، پشتیبانی از زبان های مختلف است که این هدف با کمک CLS محقق شده است . برای این که زبان های مختلف بتوانند با هم ادغام شوند ، نکته ی مهم این است که باید در ویژگی های اساسی و اصلی با هم مشترک باشند، مثل انواع مورد استفاده. به عنوان مثال هر زبان سایز و نوع داده ی مخصوص به خودش را دارد. بنابراین CLS یک توافق نامه بین طراحان زبان های مختف و طراحان class library ها است که این نکات را رعایت کنند.

سوال 5 : managed code (کد مدیریت شده) چیست؟

پاسخ:

منبع (resource) که در درون دامنه ی برنامه شما است ، managed code نام دارد. منابعی که در درون دامنه هستند سریع تر از سایر منابع عمل می کنند.

کدی که در .NET framework توسعه داده شده است ، به عنوان managed code شناخته می شود.این کد مستقیما  در CLR و با کمک اجراکننده managed code اجرا می شود. هر زبانی که در .NET Framework نوشته شده است، managed code است.

managed code از CLR استفاده می کند که امکاناتی نظیر مدیریت حافظه ، مدیریت مسائل امنیتی، انجام عمل دیباگ بر روی زبان های مختلف و ... را فراهم می کند.

پرسش 6 : MSIL  چیست؟

پاسخ :

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

پرسش 7 : JIT چیست؟

یک وب سرویس یا یک فایل Web Forms برای اجرا شدن باید به وسیله ی CLR کامپایل شود. عمل کامپایل می تواند به صورت غیر صریح (implicit) و یا صریح (explicit ) انجام بگیرد. اگرچه می توانید به صورت صریح و مستقیم کامپایلر مناسب را برای کامپایل کردن وب سرویس یا Web Forms file های خودتان فراخوانی کنید، بهتر است اجازه بدهید فایل به صورت غیر صریح کامپایل شود. کامپایل غیرصریح زمانی اتفاق می افتد که شما asmx را با HTTP-SOAP, HTTP-GET,  و  HTTP-POST فراخوانی می کنید. parser مشخص می کند که آیا نسخه ی جاری از assembly در حافظه و یا بر روی دیسک وجود دارد یا خیر. اگر به هر دلیلی امکان استفاده از نسخه ی جاری وجود نداشته باشد، parser فراخوانی مناسب را برای کامپایلر خاص انجام می دهد.

زمانی که وب سرویس یا Web Forms page به صورت غیرصریح کامپایل می شود، در حقیقت دو بار عمل کامپایل اتفاق می افتد؛ در بار اول ابتدا به IL کامپایل می شود. در بار دوم ، وب سرویس به زبان ماشین تبدیل می شود. این فرآیند کامپایل Just-In-Time JIT نامیده می شود زیرا این کار تا زمانی که assembly بر روی ماشین هدف هست، اتفاق نمی افتد.

انواع JIT :

پرسش 8: portable executable (PE) چیست؟

پاسخ :

هر برنامه ی .NET ابتدا با یک کامپایلر مناسب کامپایل می شود، مانند زمانی یک برنامه ی C#  می نویسیم و سپس آن را با یک کامپایلر C# کامپایل می کنیم.

در .NET framework هر برنامه در یک سیستم عامل با استفاده از CLR (Common Language Runtime) اجرا می شود.

Managed module ، یک فایل اجرایی قابل حمل است که شامل قسمت های زیر است:

PE Header

فرمت این بخش مانند یک فایل شی معمولی است.

CLR Header

این فایل شامل نسخه ی CLR است که نیاز به اجرای کدهای مدیریت شده ، location و metadata دارد. این فایل ، همچنین یک نقطه ی ورودی برای توابع است.

Metadata

این بخش ، شامل جدولی از اطلاعات است. یعنی متغیرها همراه با نوع داده هایشان و همچنین مقادیر پیش فرض ، توابع و متدهایی که در برنامه تعریف شده اند، در آن قرار دارند.

پرسش 9 : دامنه ی برنامه به چه معناست؟

دامنه ی برنامه یک محتوای منطقی برای مجموعه ای از assembly ها است که بر روی host قابل اجرا هستند. همان طور که می دانید یک پردازش ممکن است شامل چندین دامنه ی محتوا باشد ، که هر کدام میزبان یک .NET قابل اجرا باشند.  زمانی که CLR  شروع به فعالیت می کند، اولین appdomain ای که ایجاد می شود، AppDomain پیشفرض نام دارد و این نوع پیش فرض زمانی که فرآیند به اتمام برسد، از بین می رود.

یک  AppDomainمی تواند به تنهایی امن باشد.

یک AppDomain می تواند بارگذاری نشود.

به صورت مستقل پیکربندی می شود.

تحت تاثیر appdomain های دیگر نیست.

کارآیی بالا

یک AppDomain چگونه ایجاد می شود؟

کلاس AppDomain برای ایجاد و نابود کردن دامنه های برنامه ها، بارگذاری و لغو بارگذاری assembly ها و نوع ها و شمارش thread ها در یک دامنه استفاده می شود. در جدول زیر برخی از متدهای کاربردی کلاس AppDomain توضیح داده شده اند:

علاوه بر این، کلاس AppDomain یک مجموعه از Property هایی که می توانند برای ما در هنگام مانیتور سازی فعالیت های دامنه برنامه های داده شده مفید باشند، تعریف می کند.

پرسش 10 : assembly چیست؟

پاسخ :

Assembly یک بلوک ساخته شده پایه از برنامه های .NET Framework است. اساسا Assembly یک کد کامپایل شده است که می تواند توسط CLR اجرا شود. Assembly مجموعه ای از انواع و منابعی است که برای کار با یکدیگر ساخته شده اند و یک واحد کاری منطقی را شکل داده اند. Assembly می تواند یک DLL و یا یک فایل exe باشد.

Assembly ها اساسا دو نوع می توانند باشند:

  Private Assembly2- Shared Assembly

پرسش 11 : محتویات Assembly شامل چه مواردی است؟

پاسخ :

Assembly جزء اصلی توسعه ی برنامه ها و نسخه بندی آن است.

Assembly همچنین بخش سازنده ی برنامه ی .NET نامیده می شود.

Assembly یک فایل .dll و یا .exe است.

ساختار Assembly از بخش های زیر ساخته شده است:

Assembly manifest (نام-زبان-نسخه)

کد   CIL  (بخش منطقی)

اطلاعات مربوط به نوع (Datatype)

منابع

پرسش 12 : انواع مختلف assembly ها چیست؟

پاسخ:

یک Assembly شامل metadata و اطلاعات مربوط به manifest است . ضرورت وجود مفاهیم مربوط به Assembly ها غلبه بر مشکل "DLL Hell" در COM است . assembly شامل همه ی کدها ، منابع ، metadata و اطلاعات مربوط به نسخه است. Metadata شامل جزئیات  همه ی "نوع " هایی است که در داخل assembly وجود دارند. علاوه بر metadata ، یک فایل مخصوص به نام Manifest نیز دارد. این فایل حاوی اطلاعات مربوط به نسخه ی جاری برنامه ، اطلاعات مربوط به پیشینه و کلید عمومی (در صورت وجود)  و سایر اطلاعات در این زمینه است.

سه نوع مختلف Assembly به شرح زیر هستند:

1-   Private Assembly

2-نام Strong و یا Shared مربوط به assembly

3- Satellite assembly

پرسش 13: یک assembly داینامیک به چه معناست؟

پاسخ:

به صورت تکنیکی ، عمل بارگذاری assembly های خارجی (external assemblies) در صورت نیاز به عنوان بارگذاری داینامیک شناخته می شود. با استفاده از کلاس Assembly ، ما می توانیم هم Assembly های خصوصی (private) و هم Assembly های shared را به صورت داینامیک از جایگاه محلی به یک محل خارج از آن همراه با Property های مربوط به Assembly ببریم.

برای نمایش نحوه ی بارگذاری داینامیک ، یک برنامه ی مبتنی بر کنسول ایجاد می کنیم که یک TestLib.dll assembly خارجی را بارگذاری می کند. در زمان اجرا برنامه از کاربر می خواهد تا نام assembly ای که می خواهد به صورت داینامیک بارگذاری شود را انتخاب کند، سپس مسیر به متد کمکی که مسئول بارگذاری assembly است فرستاده می شود.

پرسش 14: GAC چیست؟

پاسخ:

GAC یک محل به اشتراک گذاری شده در کامپیوتر است که زمانی که ما یک assembly را در آن قرار بدهیم، از تعداد زیادی مکان های دیگر قابل دسترسی خواهد بود. به این معنی که در برنامه ها و پروژه های دیگر نیز قابل دسترسی است. این مورد همیشه کمک زیادی برای انتخاب یک نام strong برای یک public assembly می کند. اگر assembly در GAC ثبت نشود، ممکن است مشکل DLL hell اتفاق بیفتد.

مشکلاتی که اتفاق می افتد

DLL هایی وجود دارند که به GAC اضافه شده اند و شما نمی توانید آن ها را حذف کنید- که این مورد بسیار آزاردهنده است.-  DLL هایی نیز وجود دارند که در cache ثبت شده اند ولی پس از بررسی با استفاده از ILDASM متوجه می شویم که آن ها دیگر در GAC وجود ندارند.

نام گذاری assembly به روش Strong

وقتی که می خواهید از این روش استفاده کنید، مطمئن شوید که slash های directory به صورت درست درون فایل assembly قرار گرفته اند. در غیر اینصورت زمانی که کد به دنبال فایل .snk می گردد، با خطا مواجه خواهید شد. اگر در هنگام کار با این موارد، به خطا برخورد کردید، فایل .snk را پاک کنید و دوباره از ابتدا شروع کنید.

Reference های مربوط به پروژه

در زمان build کردن پروژه ها نهایت دقت را داشته باشید زیرا referenced DLL های موجود به راحتی می توانند به جای اینکه در پوشه ی release قرار بگیرند، اشتباها در توسعه جای بگیرند. حتی زمانی که شما پوشه ی release را مشخص می کنید ، نیز این اتفاق ممکن است بیفتد.

نتیجه گیری

فقط زمانی که حقیقتا به GAC نیاز دارید، از آن استفاده کنید. زیرا مشکلات کار با آن بسیار زیاد است . همچنین فقط زمانی که DLL ای دارید که در میان چندین پروژه به اشتراک گذاشته شده است، از GAC استفاده کنید.

پرسش 15 : garbage collector چیست؟

garbage collector (زباله جمع کن) بخشی از .NET Framework است که انتساب حافظه به برنامه های .NET شما  و همچنین آزاد سازی حافظه را بر عهده دارد. Common Language Runtime (CLR) اختصاص دهی حافظه به برنامه ها را مدیریت می کند. برنامه نویسان C# هیچ گاه این کار را به صورت مستقیم انجام نمی دهند، این کار در زبان  C# بر عهده ی زباله جمع کن است .

مثال

فرض کنید که پشته ی مدیریت شده ای که در اختیار داریم (managed heap) شامل شی هایی به نام های A, B, C, D, E, F و G است. ، در طول زمان انجام عملیات garbage collection ، این شی ها برای root های فعال مورد بررسی قرار می گیرند. بعد از این که گراف به صورت کامل ساخته شد، شی هایی که دسترسی به آن ها ممکن نیست(که ما فرض می کنیم شی های C و F هستند ) به عنوان زباله در نظر گرفته می شوند.

سوال 16 : generation ها چیست و چگونه توسط garbage collector به کار گرفته می شود؟

پاسخ:

اساسا generation در Garbage Collection (GC) نشان دهنده ی میزان عمر یک شی است، به این معنی که این فاکتور تعیین می کند که چه مدت زمانی شی در حافظه باقی خواهد ماند. Generation به سه دسته تقسیم می شود:

    Generation 0

    Generation 1

    Generation 2

آموزش سی شارپ

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان
  • C#.net
  • 2k بازدید
  • 3 تشکر

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید