سؤال

لنفترض أن لدي تطبيقًا به أخطاء مثل هذا:

using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("2 + 1 = {0}", Add(2, 1));
        }

        static int Add(int x, int y)
        {
            return x + x; // <-- oops!
        }
    }
}

تم بالفعل تجميع التطبيق ونشره في البرية.لقد وجد شخص ما الخطأ، والآن يطلبون إصلاحه.على الرغم من أنه يمكنني إعادة نشر هذا التطبيق مع الإصلاح، إلا أنه يمثل مشكلة كبيرة لأسباب خارجة عن إرادتي - أريد فقط أن أكتب تصحيحًا للخلل بدلاً من ذلك.

على وجه التحديد، أريد إدراج MSIL الخاص بي في ملف مصدر التجميع المخالف.لم أفعل شيئًا كهذا من قبل، ولم يظهر البحث على Google أي معلومات مفيدة.إذا تمكنت من رؤية نموذج لكيفية القيام بذلك في الكود أعلاه، فسيساعدني ذلك بشكل كبير :)

كيف يمكنني حقن MSIL الخاص بي برمجيًا في مجموعة .NET المترجمة؟

[تعديل للإضافة:] إلى من سأل:لا أحتاج إلى التبديل السريع في وقت التشغيل.من الجيد تمامًا بالنسبة لي أن أقوم بإغلاق التطبيق، والتعامل مع التجميع، ثم إعادة تشغيل البرنامج مرة أخرى.

[عدل مرة أخرى:] يبدو أن الإجماع العام هو "التلاعب بالتجميع هو أ سيء طريقة لتصحيح البرنامج".لن أسير في هذا الطريق إذا كان فكرة سيئة.

سأترك السؤال مفتوحًا لأن حقن MSIL قد يظل مفيدًا لأغراض أخرى :)

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

المحلول

أعتقد أن السؤال الذي سأطرحه هو "كيف يمكنك نشر التصحيح"؟في مكان ما، يتعين عليك نشر شيء ما لإصلاح خطأ موجود بالفعل.لماذا قد تكون إعادة ترجمة ملف dll وإصدار الإصدار الثابت مشكلة حقيقية؟أعتقد أن معرفة كيفية حقن MSIL برمجيًا سيكون أكثر صعوبة من مجرد إعادة نشر تجميع ثابت.

نصائح أخرى

بدلاً من إدخال MSIL في وقت التشغيل، هل فكرت في إدراج المصدر مباشرة في التجميع؟

يمكنك التفكيك باستخدام ildasm، وإدخال MSIL الخاص بك، ثم إعادة التجميع باستخدام ildasm، ثم نشر المنتج الخاص بذلك.

إذا كان السبب وراء عدم رغبتك في إعادة نشر العناصر بأكملها هو أنها في الواقع نصف عملية، فمن المحتمل أن تستخدم نوعًا من أدوات التصحيح الثنائية - هذه هي النتيجة الأولى على Google:

الفرق الثنائي http://www.daemonology.net/bsdiff/

إذا تم توقيع ملف exe الخاص بك، فلن يكون ذلك ممكنًا.لماذا لا يمكنك تحرير هذا التجميع الفردي، بدلاً من شحن التطبيق بأكمله مرة أخرى؟يبدو أنك تهدف إلى حل معقد لمشكلة بسيطة.

يمكنك استخدام حقن MSIL الثابت.قد يكون Mono Cecil أو PostSharp مفيدًا.

مصدر جيد للمعلومات...

كتاب IL للبرمجة

آخر هو كتاب MS Press عن برمجة IL.

خطوات فك الترجمة إلى IL وإعادة الترجمة

1.ildasm /output=ConsoleApplication1.il ConsoleApplication1.exe

2.// تعديل كود ConsoleApplication1.il

3.ilasm ConsoleApplication1.il

ستحتاج إلى تعليمات برمجية غير مُدارة لتنفيذ ذلك بنجاح ولكن يمكن القيام بذلك...

يرى http://www.codeproject.com/Articles/463508/NET-CLR-Injection-Modify-IL-Code-during-Run-time

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top