كيف ومتى يقوم .NET فعلا برمز التعليمات البرمجية؟

StackOverflow https://stackoverflow.com/questions/1236182

  •  11-09-2019
  •  | 
  •  

سؤال

دعنا نقول أنك تكتب تطبيقا في C #، VB، أي شيء مع .NET عندما تضغط على إنشاء، هل تجميع التعليمات البرمجية حقا؟ اعتقدت ذلك حتى بدأت في استخدام عاكس العاكس على بعض جمعياتي ورأيت الرمز الحرفي الخاص بي. كنت أتوقع أن تكون حلقات أن تكون واضحة وآخر عدد كبير من التحسينات، وبدلا من ذلك لا شيء.

إذن متى يحدث التجميع فعلا؟ أعتقد أنه عندما يتم بناؤه، يصبح التعليمات البرمجية (لغة وسيط) وعندما يحدث التنفيذ، يتم تحميله في CLR؟ هل تم تحسينه أثناء CLR فقط ولن يحدث وقت بناء؟

هل كانت مفيدة؟

المحلول

عندما تجميع في مقابل

  1. يتم تجميع شفرة المصدر الخاصة بك في كود بايت يعرف باسم اللغة الوسيطة المشتركة (CIL) أو MSIL (لغة Microsoft Intermediate).
  2. يتم تضمين البيانات الوصفية من كل فصل وكل طرق (وكل شيء آخر: O) في رأس PE للتنفيذ الناتج (سواء كان DLL أو EXE).
  3. إذا كنت تنتج قابلة للتنفيذ، فإن رأس PE يتضمن أيضا Boottrapper التقليدي وهو المسؤول عن تحميل CLR (وقت تشغيل اللغة الشائعة) عند تنفيذك قابل للتنفيذ.

عند تنفيذ:

  1. تهيئة Bootstraper CLR (بشكل رئيسي عن طريق تحميل مجموعة MSCORLIB) ويرشدها لتنفيذ تجميعك.
  2. يقوم CLR بإعدام الإدخال الرئيسي الخاص بك.
  3. الآن، تحتوي الفصول الدراسية على جدول ناقلات يحمل عناوين وظائف الطريقة، بحيث عند استدعاء MyMethod، يتم البحث في هذا الجدول ثم يتم إجراء مكالمة مقابلة إلى العنوان. عند بدء تشغيل جميع الإدخالات لجميع الطاولات لها عنوان برنامج التحويل البرمجي JIT.
  4. عند إجراء مكالمة إلى إحدى هذه الأسلوب، يتم استدعاء JIT بدلا من الطريقة الفعلية والتحكم فيها. ثم يقوم JIT ثم بتجميع رمز CIL في رمز التجميع الفعلي لريمارة التباين.
  5. بمجرد ترجمة التعليمات البرمجية، يذهب JIT إلى جدول Votower Vector ويستبدل العنوان بأحد التعليمات البرمجية المترجمة، بحيث لم تعد مكالمة لاحقة تستهلك JIT.
  6. أخيرا، يعالج JIT تنفيذ التعليمات البرمجية المترجمة.
  7. إذا استدعيت طريقة أخرى لم تجميعها بعد، فارجع إلى 4 ... وهكذا ...

أنا نشر الجواب هنا أيضا لأن السؤال الآخر لم يكن حقا حول هذا ...

نصائح أخرى

يتم تجميعها إلى Il AT، حسنا، تجميع الوقت. سحر العاكس هو أنه "يفهم" il ويحوله مرة أخرى إلى c # (أو vb.net أو أيا كان. انظر ضمن قائمة الخيارات في العاكس، ويمكنك عرض التجميع بأي شكل، بما في ذلك IL).

في العاكس، أنت فعلا لا ترى الكود الأصلي الخاص بك. أنت ترى ترجمة ل IL في C #. معظم الوقت الذي سيكون مشابه جدا لما كتبته، ولكن هناك بعض علامات Telltale - على سبيل المثال، ابحث عن مكان قمت فيه به الممتلكات التلقائية:

string MyProperty {get;set;}

وسترى ما يجمع بالفعل، وهو شيء مثل هذا:

public string MyProperty
{
    [CompilerGenerated]
    get
    {
        return this.<MyProperty>k__BackingField;
    }
    [CompilerGenerated]
    set
    {
        this.<MyProperty>k__BackingField = value;
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top