داتنت فريمورك چگونه كار ميكند؟
صفحه 1 از 1
داتنت فريمورك چگونه كار ميكند؟
داتنت امكانات متنوعي را در اختيار برنامهنويسي ما قرار ميدهد تا براي كامپيوترهاي شخصي و موبايلها سيستمهاي قدرتمندي بنويسيم. از مزاياي داتنت اين است كه برنامهها و دستگاهها را با استفاده از استانداردهايي همچون XML ،HTTP ،SOAP يكپارچه ميسازد. يكي از امكاناتي كه معماري داتنت در اختيار ما قرار ميدهد، به Side by Side Execution معروف است. بدين معنا كه با استفاده از داتنتفريمورك برنامهنويسان ميتوانند از اسمبليها استفاده كنند و نسخههاي چندتايي از يك برنامه را در يك سيستم ايجاد نمايند. CLR يكي از اجزاي مهم فريموركداتنت است. كار اصلي CLR ايجاد محيط اجرايي برنامه و ارائه سرويس به برنامهها است. در واقع اجزاي CLR دائماً با همديگر در ارتباط هستند و كار ميكنند تا بتوانند محيطي زيربنايي در دات نت براي اجرا شدن مهيا سازند.
مقدمه
داتنت نرمافزاري است كه به ما امكان ميدهد براي محيطهاي گوناگون برنامهنويسي كنيم. از برنامههاي تحت وب گرفته تا وبسرويسها و برنامههاي تحت ويندوز. از ديگر ويژگيهاي اين پلتفرم اين است كه ميتوان با استفاده از آن اطلاعات را بين برنامههاي مختلف و دستگاههاي ديگر جابهجا نمود.
شکل1- کامپوننتهاي داتنت
داتنت سالها است كه يكي از پلتفرمهاي قدرتمند برنامهنويسان است و ممكن است تا به حال با اين پلتفرم برنامهنويسي كرده باشيد و از ساختار و معماري آن مطلع باشيد.
با اين حال نكاتي درباره فريموركداتنت وجود دارد كه ممكن است تا به حال به آنها نياز پيدا نكرده باشيد، ولي دانستن اين نكات خالي از لطف نيست.
هدف اين مقاله، بررسي برخي از اصول و آشنايي با امكاناتي از داتنت است كه مطمئناً ديد شما را نسبت به برنامهنويسي با آن عوض خواهد كرد و پس از خواندن اين مقاله با ديدي علميتر برنامههاي خود را مينويسيد.
در ابتداي اين مقاله ابتدا معماري داتنت مورد بررسي قرار خواهد گرفت و نقش فريموركداتنت در داتنت مشخص خواهد شد.
در بخش بعدي، زبان مشترك در داتنت كه همان CLR است، مورد بررسي قرار خواهد گرفت. پس از آن چگونگي مديريت خودكار حافظه در داتنت مورد بحث قرار خواهد گرفت. پس از آن اسمبلي، پيكربندي، امنيت و ابزارهاي داتنت مورد بررسي قرار خواهد گرفت. در آخر نيز با ذكر يك مثال عملي چگونگي ايجاد يك اسمبلي قدم به قدم آموزش داده خواهد شد.
شکل2- معماري کلي داتنت
قابل اشاره است كه در اين مقاله از مثالهاي آزمون شركت مايكروسافت MCAD/MCSD 70-310.70-320استفاده شده است. همچنين در اين مقاله هر وقت از داتنت نام برده شده، منظور NET Framework. است.
نكته اول: معماري داتنت
داتنت امكانات متنوعي را براي برنامهنويسي در اختيار ما قرار ميدهد تا براي كامپيوترهاي شخصي و موبايل كامپيوترها سيستمهاي قدرتمندي بنويسيم. از مزاياي داتنت اين است كه برنامهها و دستگاهها را با استفاده از استانداردهايي همچون XML ،HTTP ،SOAP يكپارچه ميسازد.
همچنين داتنت زيربناي كنترلي از راهدور را براي ما فراهم ميسازد كه به ما اجازه ميدهد برنامهها را در پروسههاي مختلف و روي كامپيوترهاي مجزا اجرا كنيم و اطلاعات را با استفاده از باينري و پروتكل HTTP جابهجا سازيم. ابزارهايي كه دات در اختيار ما قرار ميدهد، عبارت است از:
- وبسرويسها
-NET Server Infrastructure.
- نرمافزارهاي Smart Client
- Visual Studio .NET
شكل 1 كامپوننتهاي داتنت را نشان ميدهد همانطور كه در اين شكل مشاهده ميكنيد، هسته مركزي XML Web Service است كه به برنامه كلاينت اجازه ميدهد اطلاعاتش را با سرور يا كلاينتهاي ديگر مبادله كند.
شکل3
NET Framework. در حقيقت ساختار زيربنايي براي ساختن برنامههاي داتنت است.
مدل برنامهنويسي NET Framework.
مدلي شيءگرا است. براي ساخت برنامهاي در داتنت ابتدا كلاس اصلي آن را ميسازيم.
سپس عملكرد آن را در قالب متدهاي آن كلاس قرار ميدهيم. نكته مهمي كه در اينجا بايد به آن اشاره نمود اين است كه كلاسي كه مثلاً با كدهاي C#.NET نوشته شده است، ميتواند به راحتي به VB.NET تغيير يابد.
ECMA يا European Computer Manufactures Association، زبان عمومي، شامل نقشهايي براي اين تبديل شدن كدها و قابليت Interoperability، را به نام CLR يا Common Language Runtime تعيين كرده است. از آن جايي كه كدهايي كه با CLR هماهنگ هستند، موقع كامپايل به كدهايي به نام IL يا Intermediate Language تبديل ميشوند (و اين كدها هستند كه در واقع اجرا ميشوند). كدهاي برنامههايي كه با CLR سازگار هستند، ميتوانند به كدهاي ديگر زبانهايي كه با CLR هماهنگ هستند تبديل ميشود.
زبانهايي كه با CLR هماهنگ هستند، عبارتند از:
- Microsoft Visual Basic.NET
- #Microsoft Visual C
- Microsoft Visual C++.NET
- Microsoft Visual J# .NET
شايان ذكر است كه در بين اين زبانها #C بهعنوان زبان استاندارد بينالمللي توسط ECMA معرفي شده است.
كدهايي كه با اين زبانها نوشته ميشوند، همه به كدهاي مياني به نام MSIL يا Microsoft Intermediate Language تبديل ميشوند.
پس ميتوان با هر يك از زبان هاي بالا برنامه را آماده كرد و اين برنامه ميتواند با برنامههاي ديگري كه به زبان متفاوت ديگري نوشته شده است، سازگار باشد.
همانطور كه قبلاً بيان شد يكي از امكاناتي كه معماري داتنت در اختيار ما قرار ميدهد به نام Side by Side Execution معروف است. بدينمعنا كه با استفاده از داتنت فريمورك برنامهنويسان ميتوانند با استفاده از اسمبليها نسخههاي چندتايي از يك برنامه را در يك سيستم داشته باشند.
اسمبليها شامل كدهاي IL و Metadata (مسئول نگهداري اطلاعاتي همچون نام و نسخه برنامه) هستند.
شکل4
CLR در حقيقت با استفاده از Metadata و جمعآوري اطلاعات نسخههاي برنامه ميتواند نيازهاي برنامه را پيدا كند و به ما اجازه دهد نسخههاي مختلف از يك برنامه را به صورت Side By Side اجرا كنيم.
همانطور كه در شكل 2 مشاهده ميكنيد، فريموركداتنت شامل دو كامپوننت است:
كتابخانه كلاسها و CLR. كتابخانه كلاسها در حقيقت Typeهايي كه در داتنت عمومي هستند را مشخص ميكنند و با استفاده از اين كلاسها برنامهنويسان ميتوانند برنامههاي گوناگون از قبيل Windows Forms ،Web Forms و XML Web Serviceها را تهيه كنند.
از طرف ديگر، قسمت CLR شامل كامپوننتهايي است كه كدهاي IL را اجرا ميكند و امنيت، صحت نوع دادهها و... را كنترل ميكند. كدهايي كه درون CLR اجرا ميشوند را اصطلاحاً Managed Code و اگر خارج از CLR اجرا شوند، Unmanaged Code مينامند.
نكته دوم: زبان مشترك در داتنت
همانطور كه اشاره شد CLR يكي از اجزاي مهم فريموركداتنت است. كار اصلي CLR ايجاد محيط اجرايي برنامه و ارايه سرويس به برنامهها است. در واقع اجزاي CLR دائماً با همديگر در ارتباط هستند و كار ميكنند تا بتوانند محيطي زيربنايي در داتنت براي اجرا شدن مهيا سازند. شكل 3 معماري CLR را نشان ميدهد. كار اصلي اين كامپوننتها لودكردن كدهاي IL برنامه، كامپايل كردن و اجراي آن كدها است.
كامپوننتهاي CLR كه در شكل 3 نيز مشاهده ميكنيد عبارتند از:
- لودكننده كلاسها يا Class Loader براي Load كردن كلاسها در حين اجراي برنامه
- كامپايلر تبديلكننده كدهاي MSIL به Native Code
- مدير كدها يا Code Manager كه مسئول مديريت كدها در زمان اجراي برنامه است.
- GB يا Garbage Collector براي مديريت حافظه
- موتور مديريت امنيت در سيستم
- چككننده نوع پارامترها
- پشتيبانيكننده Threadها
- مديريتExceptionها
- موتور اشكالزدايي (debug) سيستم
- COM Marshaler براي مديريت تبادل اطلاعات بين برنامههاي داتنت و برنامههاي COM
- Base Class Library
براي اينكه يك برنامه بتواند در CLR اجرا شود، بايد به يكي از زبانهاي NET. و CLS-Compliant نوشته شود.
كامپايلر داتنت اين كدها را به كدهاي MSIL و Metadata تبديل ميكند.
اين كدها شامل اطلاعاتي از قبيل نحوه لود شدن، ذخيرهشدن و چگونگي فراخواني متدها در كلاسها ميشود.
كدهاي MSIL همچنين شامل دستورات خاصي براي كار با عمليات رياضي، چگونگي مديريت خطاها و... نيز هست.
نكته سوم: مديريت خودكار حافظه در داتنت
شکل5
يكي از مزاياي داتنت مديريت خودكار حافظه است كه موقع اجراي برنامهها استفاده ميشود. در داتنت رويههاي اجرايي مديريت ميشوند و به اصطلاح موقع اجراي برنامهها MEP يا Managed Execution Process استفاده ميشود، ولي به راستي MEP چيست؟
MEP در حقيقت پروسههايي هستند كه در لود شدن و اجراي برنامهها حافظه را به صورت خودكار مديريت ميكنند. همچنين سرويسهاي ديگري مانند چك كردن Type Safety، امنيت و مديريت خطاها را ارايه ميكنند. MEP در واقع شامل كدهاي مديريت شده (Managed Code) و اطلاعات مديريت شده (Managed Data) است.
در داتنت اين اطلاعات در كدهاي MSIL ذخيره ميشوند و به صورت metadata در فايلهاي اجرايي exe وجود دارند. Managed Data توسط GC يا Garbage Collector به حافظه منتقل ميگردند و موقعي كه نيازي نيست از حافظه برداشته ميشوند.
اگرچه Managed Code ميتواند به Managed Data و Unmanaged Data دسترسي داشته باشند، Managed Dataفقط از طريق Managed Code قابل دسترسي است.
يكي از مزاياي دات نت، استفاده از GC جهت مديريت خودكار حافظه است و نيازي نيست كه براي اختصاص دادن حافظه (وقتي كه آبجكت ساخته ميشود) و آزاد كردن حافظه (وقتي كه برنامه به آن آبجكت نياز نداشته باشد) كد خاصي نوشته شود. مديريت خودكار حافظه در داتنت داراي سه مراحله زير است:
- Allocating
- Releasing
- Implementing Finalizers
مديريت اختصاص حافظه به اين طريق عمل ميكند كه وقتي يك پروسه در مرحله آغازين خود قرار دارد، بدون اختصاص هر گونه حجم، يك آدرس حافظه براي آن پروسه رزرو ميشود. اين فضاي آدرس رزرو شده را MH يا Managed heap مينامند. MH از يك پوينتر در مكاني كه Object بعدي بنا است قرار بگيرد، نگهداري ميكند. مثلاً تصور كنيد كه اسم پوينتر Pointer1 باشد. ابتدا Pointer1 به آدرس پايه از MH اشاره ميكند.
شکل6
وقتي كه در يك برنامه از Operator جديدي براي ايجاد يك آبجكت استفاده شود، آن Operator جديد مقدار حافظهاي كه براي آبجكت لازم است را در heap چك ميكند. اگر حافظه موجود باشد به آن آبجكت داده ميشود و آن آبجكت در Heap همانجا كه Pointer1 به آن اشاره كرده بود، به وجود ميآيد.
همانطور كه در شكل 4 مشاهده ميكنيد، وقتي كه آبجكت توليد شد، Pointer1 به قسمت بالاي آن ميرود.
وقتي كه آبجكت بعدي توليد شد، GCدر Managed Heap حافظه را به آن آبجكت اختصاص ميدهد و در بالاي آبجكت اولي قرار ميگيرد و Pointer1 به بالاي آبجكت جديد خواهد رفت.
در Unmanaged Memory ،pointerها در حافظه توسط ساختار Linked-List مديريت ميشوند و در نتيجه اختصاص دادن حافظه در Managed Heap زمان كمتري نسبت به Unmanaged Memory ميگيرد.
آزادسازي حافظه كار ديگري است كه مديريت خودكار حافظه در داتنت انجام ميدهد. وقتي يك آبجكت درست ميكنيد، ممكن است حافظه مورد نياز كه به آن تعلق بگيرد، وجود نداشته باشد. براي اينكه آن شيء بتواند توليد شود GC يا Garbage Collector فضاي حافظه را كه به آبجكتهايي كه ديگر نيازي به وجودشان نيست از آنها ميگيرد.
در واقع هر برنامه داراي تعدادي ريشه يا Root است. اين ريشهها به قسمتي از Managed Heap كه مسئول ذخيرهسازي است، اشاره ميكنند.
هر ريشه يا به يك آبجكت در MHاشاره ميكند يا به NULL. هر ريشه برنامه از Object Pointerهاي عمومي يا Globalو Static، متغيرهاي محلي و پارامترهاي منبع در Thread Stack تشكيل شده است و فهرست اين ريشهها توسط كامپايلر JIT نگهداري و مديريت ميشود.
GC در واقع از اين فهرست استفاده ميكند و حافظه را مديريت مينمايد. GC در ريشه برنامه جستوجو ميكند و آبجكتها را با Referenceهايشان در Root List مطابقت ميدهد.
شكل 5 شيءهاي A ،D و F را نشان ميدهد كه برنامه از آنها استفاده ميكند. اگر چه Object B مستقيماً توسط ريشه برنامه استفاده نميشود، چون توسط Object D استفاده ميشود، نميتوان حافظهاش را آزاد نمود.
شکل7
GC به هر آبجكت كه توسط برنامه چه به صورت مستقيم يا به صورت غيرمستقيم مورد استفاده قرار ميدهد دست نميزند و آبجكتهايي كه مورد استفاده قرار نميگيرند را بهعنوان Garbage يا زباله تلقي ميكند.
GC پس از شناسايي آبجكتهايي كه نيازي به آنها نيست پروسه هايي براي جمعآوري اين آبجكتها اجرا مينمايد.
پس از آنكه اين عمليات انجام شد، GC اشيا را مجدداً مرتب ميكند و همانطور كه در شكل 6 مشاهده مينماييد، پس از انجام پروسه GC اشيا مرتب ميگردند.
شايد بگوييد حال كه GC فضاي حافظه آبجكتها را خالي ميكند، ديگر نيازي به كدنويسي براي اين كار وجود ندارد، ولي بايد گفت كه GC قادر به تميز كردن منابع سيستم (System Resource) كه توسط Managed Object استفاده ميشوند نيست و براي اينكار بايد حتماً پس از آنكه كارمان با آبجكت تمام شد، متد Dispose آن را فراخواني كنيم.
براي مديريت حافظه و تميز كردن حافظه سيستم، بايد از متدهاي ers zFinaliها استفاده كرد. كدهاي شكل 7 با ذكر مثالي چگونگي اين كار را نشان ميدهد.
نكته چهارم: اسمبليها در دات نت
اسمبليها در واقع بخشهاي پايه در برنامهنويسي داتنت هستند. Assemblyها حاوي Typeها و منابع مورد نياز برنامهها ميباشند. علاوه بر اين، برنامههاي مختلف ميتوانند مثلاً از Typeهاي يك اسمبلي استفاده نمايند (اين نوع اسمبلي را Global Assembly مينامند كه معمولاً در GAC يا Global Assembly Cache نصب ميگردند).
شکل8
هر اسمبلي حاوي كدهاي MSIL است كه CLR آن را اجرا مينمايد. اسمبليها با توجه به اينكه چگونه ساخته و ذخيره شدهاند، ميتوانند به دو صورت استاتيك و دايناميك وجود داشته باشند.
اسمبلي استاتيك وقتي به وجود ميآيد كه برنامهاي را با كامپايلر زبانهاي داتنت كامپايل ميكنيم. اسمبلي استاتيك حاوي Typeها، اينترفيسها و منابعي است كه اسمبلي به آن احتياج دارد. اين اسمبلي در هاردديسك و به صورت فايلهاي DLL يا EXE وجود دارد.
از طرف ديگر، اسمبليهاي دايناميك در روي هاردديسك ذخيره نميشوند و وقتي برنامه در حال اجرا است و به تايپهاي اسمبلي خاصي نياز دارند، به وجود ميآيند.
با استفاده از Reflection APIs كه درSystem.Reflection.Emit وجود دارد، ميتوانيم آبجكتها را به صورت دايناميكي به وجود آوريم.
يك اسمبلي ميتواند به صورت يك يا چند فايل باشد. شكل 8 اسمبلي تكفايلي و چند فايلي و فرق آنها را با هم نشان ميدهد. هر فايل اسمبلي شامل Manifest و Type Metadata ،MSIL و منابع مورد نياز برنامه ميباشند.
مقدمه
داتنت نرمافزاري است كه به ما امكان ميدهد براي محيطهاي گوناگون برنامهنويسي كنيم. از برنامههاي تحت وب گرفته تا وبسرويسها و برنامههاي تحت ويندوز. از ديگر ويژگيهاي اين پلتفرم اين است كه ميتوان با استفاده از آن اطلاعات را بين برنامههاي مختلف و دستگاههاي ديگر جابهجا نمود.
شکل1- کامپوننتهاي داتنت
داتنت سالها است كه يكي از پلتفرمهاي قدرتمند برنامهنويسان است و ممكن است تا به حال با اين پلتفرم برنامهنويسي كرده باشيد و از ساختار و معماري آن مطلع باشيد.
با اين حال نكاتي درباره فريموركداتنت وجود دارد كه ممكن است تا به حال به آنها نياز پيدا نكرده باشيد، ولي دانستن اين نكات خالي از لطف نيست.
هدف اين مقاله، بررسي برخي از اصول و آشنايي با امكاناتي از داتنت است كه مطمئناً ديد شما را نسبت به برنامهنويسي با آن عوض خواهد كرد و پس از خواندن اين مقاله با ديدي علميتر برنامههاي خود را مينويسيد.
در ابتداي اين مقاله ابتدا معماري داتنت مورد بررسي قرار خواهد گرفت و نقش فريموركداتنت در داتنت مشخص خواهد شد.
در بخش بعدي، زبان مشترك در داتنت كه همان CLR است، مورد بررسي قرار خواهد گرفت. پس از آن چگونگي مديريت خودكار حافظه در داتنت مورد بحث قرار خواهد گرفت. پس از آن اسمبلي، پيكربندي، امنيت و ابزارهاي داتنت مورد بررسي قرار خواهد گرفت. در آخر نيز با ذكر يك مثال عملي چگونگي ايجاد يك اسمبلي قدم به قدم آموزش داده خواهد شد.
شکل2- معماري کلي داتنت
قابل اشاره است كه در اين مقاله از مثالهاي آزمون شركت مايكروسافت MCAD/MCSD 70-310.70-320استفاده شده است. همچنين در اين مقاله هر وقت از داتنت نام برده شده، منظور NET Framework. است.
نكته اول: معماري داتنت
داتنت امكانات متنوعي را براي برنامهنويسي در اختيار ما قرار ميدهد تا براي كامپيوترهاي شخصي و موبايل كامپيوترها سيستمهاي قدرتمندي بنويسيم. از مزاياي داتنت اين است كه برنامهها و دستگاهها را با استفاده از استانداردهايي همچون XML ،HTTP ،SOAP يكپارچه ميسازد.
همچنين داتنت زيربناي كنترلي از راهدور را براي ما فراهم ميسازد كه به ما اجازه ميدهد برنامهها را در پروسههاي مختلف و روي كامپيوترهاي مجزا اجرا كنيم و اطلاعات را با استفاده از باينري و پروتكل HTTP جابهجا سازيم. ابزارهايي كه دات در اختيار ما قرار ميدهد، عبارت است از:
- وبسرويسها
-NET Server Infrastructure.
- نرمافزارهاي Smart Client
- Visual Studio .NET
شكل 1 كامپوننتهاي داتنت را نشان ميدهد همانطور كه در اين شكل مشاهده ميكنيد، هسته مركزي XML Web Service است كه به برنامه كلاينت اجازه ميدهد اطلاعاتش را با سرور يا كلاينتهاي ديگر مبادله كند.
شکل3
NET Framework. در حقيقت ساختار زيربنايي براي ساختن برنامههاي داتنت است.
مدل برنامهنويسي NET Framework.
مدلي شيءگرا است. براي ساخت برنامهاي در داتنت ابتدا كلاس اصلي آن را ميسازيم.
سپس عملكرد آن را در قالب متدهاي آن كلاس قرار ميدهيم. نكته مهمي كه در اينجا بايد به آن اشاره نمود اين است كه كلاسي كه مثلاً با كدهاي C#.NET نوشته شده است، ميتواند به راحتي به VB.NET تغيير يابد.
ECMA يا European Computer Manufactures Association، زبان عمومي، شامل نقشهايي براي اين تبديل شدن كدها و قابليت Interoperability، را به نام CLR يا Common Language Runtime تعيين كرده است. از آن جايي كه كدهايي كه با CLR هماهنگ هستند، موقع كامپايل به كدهايي به نام IL يا Intermediate Language تبديل ميشوند (و اين كدها هستند كه در واقع اجرا ميشوند). كدهاي برنامههايي كه با CLR سازگار هستند، ميتوانند به كدهاي ديگر زبانهايي كه با CLR هماهنگ هستند تبديل ميشود.
زبانهايي كه با CLR هماهنگ هستند، عبارتند از:
- Microsoft Visual Basic.NET
- #Microsoft Visual C
- Microsoft Visual C++.NET
- Microsoft Visual J# .NET
شايان ذكر است كه در بين اين زبانها #C بهعنوان زبان استاندارد بينالمللي توسط ECMA معرفي شده است.
كدهايي كه با اين زبانها نوشته ميشوند، همه به كدهاي مياني به نام MSIL يا Microsoft Intermediate Language تبديل ميشوند.
پس ميتوان با هر يك از زبان هاي بالا برنامه را آماده كرد و اين برنامه ميتواند با برنامههاي ديگري كه به زبان متفاوت ديگري نوشته شده است، سازگار باشد.
همانطور كه قبلاً بيان شد يكي از امكاناتي كه معماري داتنت در اختيار ما قرار ميدهد به نام Side by Side Execution معروف است. بدينمعنا كه با استفاده از داتنت فريمورك برنامهنويسان ميتوانند با استفاده از اسمبليها نسخههاي چندتايي از يك برنامه را در يك سيستم داشته باشند.
اسمبليها شامل كدهاي IL و Metadata (مسئول نگهداري اطلاعاتي همچون نام و نسخه برنامه) هستند.
شکل4
CLR در حقيقت با استفاده از Metadata و جمعآوري اطلاعات نسخههاي برنامه ميتواند نيازهاي برنامه را پيدا كند و به ما اجازه دهد نسخههاي مختلف از يك برنامه را به صورت Side By Side اجرا كنيم.
همانطور كه در شكل 2 مشاهده ميكنيد، فريموركداتنت شامل دو كامپوننت است:
كتابخانه كلاسها و CLR. كتابخانه كلاسها در حقيقت Typeهايي كه در داتنت عمومي هستند را مشخص ميكنند و با استفاده از اين كلاسها برنامهنويسان ميتوانند برنامههاي گوناگون از قبيل Windows Forms ،Web Forms و XML Web Serviceها را تهيه كنند.
از طرف ديگر، قسمت CLR شامل كامپوننتهايي است كه كدهاي IL را اجرا ميكند و امنيت، صحت نوع دادهها و... را كنترل ميكند. كدهايي كه درون CLR اجرا ميشوند را اصطلاحاً Managed Code و اگر خارج از CLR اجرا شوند، Unmanaged Code مينامند.
نكته دوم: زبان مشترك در داتنت
همانطور كه اشاره شد CLR يكي از اجزاي مهم فريموركداتنت است. كار اصلي CLR ايجاد محيط اجرايي برنامه و ارايه سرويس به برنامهها است. در واقع اجزاي CLR دائماً با همديگر در ارتباط هستند و كار ميكنند تا بتوانند محيطي زيربنايي در داتنت براي اجرا شدن مهيا سازند. شكل 3 معماري CLR را نشان ميدهد. كار اصلي اين كامپوننتها لودكردن كدهاي IL برنامه، كامپايل كردن و اجراي آن كدها است.
كامپوننتهاي CLR كه در شكل 3 نيز مشاهده ميكنيد عبارتند از:
- لودكننده كلاسها يا Class Loader براي Load كردن كلاسها در حين اجراي برنامه
- كامپايلر تبديلكننده كدهاي MSIL به Native Code
- مدير كدها يا Code Manager كه مسئول مديريت كدها در زمان اجراي برنامه است.
- GB يا Garbage Collector براي مديريت حافظه
- موتور مديريت امنيت در سيستم
- چككننده نوع پارامترها
- پشتيبانيكننده Threadها
- مديريتExceptionها
- موتور اشكالزدايي (debug) سيستم
- COM Marshaler براي مديريت تبادل اطلاعات بين برنامههاي داتنت و برنامههاي COM
- Base Class Library
براي اينكه يك برنامه بتواند در CLR اجرا شود، بايد به يكي از زبانهاي NET. و CLS-Compliant نوشته شود.
كامپايلر داتنت اين كدها را به كدهاي MSIL و Metadata تبديل ميكند.
اين كدها شامل اطلاعاتي از قبيل نحوه لود شدن، ذخيرهشدن و چگونگي فراخواني متدها در كلاسها ميشود.
كدهاي MSIL همچنين شامل دستورات خاصي براي كار با عمليات رياضي، چگونگي مديريت خطاها و... نيز هست.
نكته سوم: مديريت خودكار حافظه در داتنت
شکل5
يكي از مزاياي داتنت مديريت خودكار حافظه است كه موقع اجراي برنامهها استفاده ميشود. در داتنت رويههاي اجرايي مديريت ميشوند و به اصطلاح موقع اجراي برنامهها MEP يا Managed Execution Process استفاده ميشود، ولي به راستي MEP چيست؟
MEP در حقيقت پروسههايي هستند كه در لود شدن و اجراي برنامهها حافظه را به صورت خودكار مديريت ميكنند. همچنين سرويسهاي ديگري مانند چك كردن Type Safety، امنيت و مديريت خطاها را ارايه ميكنند. MEP در واقع شامل كدهاي مديريت شده (Managed Code) و اطلاعات مديريت شده (Managed Data) است.
در داتنت اين اطلاعات در كدهاي MSIL ذخيره ميشوند و به صورت metadata در فايلهاي اجرايي exe وجود دارند. Managed Data توسط GC يا Garbage Collector به حافظه منتقل ميگردند و موقعي كه نيازي نيست از حافظه برداشته ميشوند.
اگرچه Managed Code ميتواند به Managed Data و Unmanaged Data دسترسي داشته باشند، Managed Dataفقط از طريق Managed Code قابل دسترسي است.
يكي از مزاياي دات نت، استفاده از GC جهت مديريت خودكار حافظه است و نيازي نيست كه براي اختصاص دادن حافظه (وقتي كه آبجكت ساخته ميشود) و آزاد كردن حافظه (وقتي كه برنامه به آن آبجكت نياز نداشته باشد) كد خاصي نوشته شود. مديريت خودكار حافظه در داتنت داراي سه مراحله زير است:
- Allocating
- Releasing
- Implementing Finalizers
مديريت اختصاص حافظه به اين طريق عمل ميكند كه وقتي يك پروسه در مرحله آغازين خود قرار دارد، بدون اختصاص هر گونه حجم، يك آدرس حافظه براي آن پروسه رزرو ميشود. اين فضاي آدرس رزرو شده را MH يا Managed heap مينامند. MH از يك پوينتر در مكاني كه Object بعدي بنا است قرار بگيرد، نگهداري ميكند. مثلاً تصور كنيد كه اسم پوينتر Pointer1 باشد. ابتدا Pointer1 به آدرس پايه از MH اشاره ميكند.
شکل6
وقتي كه در يك برنامه از Operator جديدي براي ايجاد يك آبجكت استفاده شود، آن Operator جديد مقدار حافظهاي كه براي آبجكت لازم است را در heap چك ميكند. اگر حافظه موجود باشد به آن آبجكت داده ميشود و آن آبجكت در Heap همانجا كه Pointer1 به آن اشاره كرده بود، به وجود ميآيد.
همانطور كه در شكل 4 مشاهده ميكنيد، وقتي كه آبجكت توليد شد، Pointer1 به قسمت بالاي آن ميرود.
وقتي كه آبجكت بعدي توليد شد، GCدر Managed Heap حافظه را به آن آبجكت اختصاص ميدهد و در بالاي آبجكت اولي قرار ميگيرد و Pointer1 به بالاي آبجكت جديد خواهد رفت.
در Unmanaged Memory ،pointerها در حافظه توسط ساختار Linked-List مديريت ميشوند و در نتيجه اختصاص دادن حافظه در Managed Heap زمان كمتري نسبت به Unmanaged Memory ميگيرد.
آزادسازي حافظه كار ديگري است كه مديريت خودكار حافظه در داتنت انجام ميدهد. وقتي يك آبجكت درست ميكنيد، ممكن است حافظه مورد نياز كه به آن تعلق بگيرد، وجود نداشته باشد. براي اينكه آن شيء بتواند توليد شود GC يا Garbage Collector فضاي حافظه را كه به آبجكتهايي كه ديگر نيازي به وجودشان نيست از آنها ميگيرد.
در واقع هر برنامه داراي تعدادي ريشه يا Root است. اين ريشهها به قسمتي از Managed Heap كه مسئول ذخيرهسازي است، اشاره ميكنند.
هر ريشه يا به يك آبجكت در MHاشاره ميكند يا به NULL. هر ريشه برنامه از Object Pointerهاي عمومي يا Globalو Static، متغيرهاي محلي و پارامترهاي منبع در Thread Stack تشكيل شده است و فهرست اين ريشهها توسط كامپايلر JIT نگهداري و مديريت ميشود.
GC در واقع از اين فهرست استفاده ميكند و حافظه را مديريت مينمايد. GC در ريشه برنامه جستوجو ميكند و آبجكتها را با Referenceهايشان در Root List مطابقت ميدهد.
شكل 5 شيءهاي A ،D و F را نشان ميدهد كه برنامه از آنها استفاده ميكند. اگر چه Object B مستقيماً توسط ريشه برنامه استفاده نميشود، چون توسط Object D استفاده ميشود، نميتوان حافظهاش را آزاد نمود.
شکل7
GC به هر آبجكت كه توسط برنامه چه به صورت مستقيم يا به صورت غيرمستقيم مورد استفاده قرار ميدهد دست نميزند و آبجكتهايي كه مورد استفاده قرار نميگيرند را بهعنوان Garbage يا زباله تلقي ميكند.
GC پس از شناسايي آبجكتهايي كه نيازي به آنها نيست پروسه هايي براي جمعآوري اين آبجكتها اجرا مينمايد.
پس از آنكه اين عمليات انجام شد، GC اشيا را مجدداً مرتب ميكند و همانطور كه در شكل 6 مشاهده مينماييد، پس از انجام پروسه GC اشيا مرتب ميگردند.
شايد بگوييد حال كه GC فضاي حافظه آبجكتها را خالي ميكند، ديگر نيازي به كدنويسي براي اين كار وجود ندارد، ولي بايد گفت كه GC قادر به تميز كردن منابع سيستم (System Resource) كه توسط Managed Object استفاده ميشوند نيست و براي اينكار بايد حتماً پس از آنكه كارمان با آبجكت تمام شد، متد Dispose آن را فراخواني كنيم.
براي مديريت حافظه و تميز كردن حافظه سيستم، بايد از متدهاي ers zFinaliها استفاده كرد. كدهاي شكل 7 با ذكر مثالي چگونگي اين كار را نشان ميدهد.
نكته چهارم: اسمبليها در دات نت
اسمبليها در واقع بخشهاي پايه در برنامهنويسي داتنت هستند. Assemblyها حاوي Typeها و منابع مورد نياز برنامهها ميباشند. علاوه بر اين، برنامههاي مختلف ميتوانند مثلاً از Typeهاي يك اسمبلي استفاده نمايند (اين نوع اسمبلي را Global Assembly مينامند كه معمولاً در GAC يا Global Assembly Cache نصب ميگردند).
شکل8
هر اسمبلي حاوي كدهاي MSIL است كه CLR آن را اجرا مينمايد. اسمبليها با توجه به اينكه چگونه ساخته و ذخيره شدهاند، ميتوانند به دو صورت استاتيك و دايناميك وجود داشته باشند.
اسمبلي استاتيك وقتي به وجود ميآيد كه برنامهاي را با كامپايلر زبانهاي داتنت كامپايل ميكنيم. اسمبلي استاتيك حاوي Typeها، اينترفيسها و منابعي است كه اسمبلي به آن احتياج دارد. اين اسمبلي در هاردديسك و به صورت فايلهاي DLL يا EXE وجود دارد.
از طرف ديگر، اسمبليهاي دايناميك در روي هاردديسك ذخيره نميشوند و وقتي برنامه در حال اجرا است و به تايپهاي اسمبلي خاصي نياز دارند، به وجود ميآيند.
با استفاده از Reflection APIs كه درSystem.Reflection.Emit وجود دارد، ميتوانيم آبجكتها را به صورت دايناميكي به وجود آوريم.
يك اسمبلي ميتواند به صورت يك يا چند فايل باشد. شكل 8 اسمبلي تكفايلي و چند فايلي و فرق آنها را با هم نشان ميدهد. هر فايل اسمبلي شامل Manifest و Type Metadata ،MSIL و منابع مورد نياز برنامه ميباشند.
pooriamirani- کاربر متوسط
- تعداد پستها : 119
تاريخ التسجيل : 2009-10-24
العمر : 38
آدرس پستي : pooriamirani1291@yahoo.com
مواضيع مماثلة
» تگ فريم (Frame)
» فريم بندی صفحات html ي
» 160 مگاپيكسل
» سری مقالات mohammad_moradi
» چگونه میتوکنیم انیم از کریستال ریپورت در اکسل استفاده
» فريم بندی صفحات html ي
» 160 مگاپيكسل
» سری مقالات mohammad_moradi
» چگونه میتوکنیم انیم از کریستال ریپورت در اکسل استفاده
صفحه 1 از 1
صلاحيات هذا المنتدى:
شما نمي توانيد در اين بخش به موضوعها پاسخ دهيد