استخدام وقت التشغيل لبيانات التعريف

لفهم أفضل لبيانات التعريف والدور الخاص بها في وقت تشغيل اللغة العامة ، قد يكون مفيداً إنشاء برنامج بسيط و توضيح كيف تؤثر بيانات التعريف على حياة وقت التشغيل الخاص بها. يوضح مثال التعليمات البرمجية التالي أسلوبين داخل فئة تسمى MyApp. الأسلوب Main هو نقطة دخول البرنامج ,بينما الأسلوب Addيرجع ببساطة مجموع وسيطين نوعهما رقم صحيح.

Public Class MyApp
   Public Shared Sub Main()
      Dim ValueOne As Integer = 10
      Dim ValueTwo As Integer = 20
      Console.WriteLine("The Value is: {0}", Add(ValueOne, ValueTwo))
   End Sub
   
   Public Shared Function Add(One As Integer, Two As Integer) As Integer
      Return (One + Two)
   End Function
End Class
using System;  
public class MyApp
{
   public static int Main()
   {
      int ValueOne = 10;
      int ValueTwo = 20;         
      Console.WriteLine("The Value is: {0}", Add(ValueOne, ValueTwo));
      return 0;
   }
   public static int Add(int One, int Two)
   {
      return (One + Two);
   }
}

عندما تعمل التعليمات البرمجية , يحمل وقت التشغيل الوحدة في الذاكرة و يستشير بيانات التعريف لهذه الفئة. بمجرد تحميلها, وقت التشغيل يقوم بتحليل شامل لدفق لغة Microsoft الوسيطة (MSIL) الخاصة بالأسلوب لتحويلها إلى تعليمات الجهاز الأصلية السريعة. وقت التشغيل يستخدم برنامج التحويل البرمجي في الوقت المناسب (JIT) لتحويل تعليمات MSIL إلى تعليمات الجهاز البرمجية الأصلية أسلوب واحد في كل مرة عند الحاجة.

يظهر المثال التالي جزء من الـ MSIL الناتجة من دالة التعليمات البرمجية السابقة Main. يمكنك عرض الـ MSIL و بيانات التعريف من أي تطبيق .NET Framework باستخدام مفكك MSIL (Ildasm.exe) .

      .entrypoint
      .maxstack  3
      .locals ([0] int32 ValueOne,
               [1] int32 ValueTwo,
               [2] int32 V_2,
               [3] int32 V_3)
      IL_0000:  ldc.i4.s   10
      IL_0002:  stloc.0
      IL_0003:  ldc.i4.s   20
      IL_0005:  stloc.1
      IL_0006:  ldstr      "The Value is: {0}"
      IL_000b:  ldloc.0
      IL_000c:  ldloc.1
      IL_000d:  call int32 ConsoleApplication.MyApp::Add(int32,int32) /* 06000003 */

يقرأ مترجم JIT البرمجي للأسلوب بالكامل , و يحللها بدقة ,و يولد تعليمات أصلية ذات كفاءة للأسلوب. في IL_000d، رمز مميز لبيانات التعريف للأسلوب Add (/* 06000003 */) تتم مواجهته و يستخدم وقت التشغيل الرمز المميز للرجوع إلى الصف الثالث من جدول MethodDef.

يعرض الجدول التالي جزء من جدول MethodDef المشار إليه بواسطة الرمز المميز لبيانات التعريف التي تصف الأسلوب Add. أثناء وجود جداول لبيانات تعريف أخرى في هذا التجميع و تحتوي على قيمها الفريدة , تتم مناقشة هذا الجدول فقط.

صف

العنوان الظاهري النسبي (RVA)

ImplFlags

Flags

الاسم

(نقاط إلى كومة السلاسل في الذاكرة المؤقتة.)

التوقيع (نقاط إلى كومة الذاكرة المؤقتة لـ blob.)

1

0x00002050

IL

Managed

Public

ReuseSlot

SpecialName

RTSpecialName

.ctor

.ctor (منشئ)

 

2

0x00002058

IL

Managed

Public

الوضع الثابت

ReuseSlot

الرئيسي

سلسة نصية

3

0x0000208c

IL

Managed

Public

الوضع الثابت

ReuseSlot

Add

int, int, int

كل عمود من الجدول يحتوي على معلومات هامة حول التعليمات البرمجية الخاصة بك. يسمح العمود RVA لوقت التشغيل بحساب عنوان البداية في الذاكرة للـ MSIL التي تعرف هذا الأسلوب. الأعمدة ImplFlags و Flags تحتوي أقنعة بت التي تصف الأسلوب (على سبيل المثال، ما إذا كان الأسلوب عام أم خاص). عمود الاسم يفهرس اسم الأسلوب من كومة السلاسل النصية في الذاكرة المؤقتة. عمود التوقيع يفهرس تعريف توقيع الأسلوب في كومة blob في الذاكرة المؤقتة.

وقت التشغيل يحسب عنوان الإزاحة المطلوب من العمود RVA في الصف الثالث و يرجع هذا العنوان إلى مترجم JIT البرمجي , و الذي يتقدم إلى العنوان الجديد. مترجم JIT البرمجي يستمر في معالجة MSIL في العنوان الجديد حتى تواجه رمز مميز آخر لبيانات تعريف و تُكرر العملية.

باستخدام بيانات التعريف ، وقت التشغيل له حق الوصول إلى كافة المعلومات التي يحتاج إليها لتحميل التعليمات البرمجية الخاصة بك و معالجتها إلى تعليمات الجهاز الأصلية. بهذه الطريقة تُمكِن بيانات التعريف الملفات التي تصف نفسها بنفسها , مع نظام الأنواع الشائع ، و توريث اللغة المشتركة.

راجع أيضًا:

المبادئ

بيانات التعريف و المكونات التي تصف نفسها

عملية تنفيذ مُدارة