سؤال

حيوانات الخلد هو إطار العزل الذي أنشأه Microsoft. تتمثل الميزة الباردة في الشامات في أنه يمكن أن "يسخر" من الطرق الثابتة/غير الذروة والفئات المختومة (وهو أمر غير ممكن مع أطر مثل MOQ). فيما يلي عرض سريع لما يمكن أن تفعله الشامات:

Assert.AreNotEqual(new DateTime(2012, 1, 1), DateTime.Now);

// MDateTime is part of Moles; the below will "override" DateTime.Now's behavior
MDateTime.NowGet = () => new DateTime(2012, 1, 1); 
Assert.AreEqual(new DateTime(2012, 1, 1), DateTime.Now);

يبدو أن Moles قادر على تعديل مجموعة الأشياء من الأشياء مثل DateTime.Now في وقت التشغيل. نظرًا لأن Moles غير مفتوح المصدر ، فأنا أشعر بالفضول لمعرفة الآلية التي تستخدمها Moles من أجل تعديل CIL في وقت التشغيل. يمكن لأي شخص أن يلقي أي ضوء؟

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

المحلول

Moles ينفذ profiler CLR (ولا سيما IcorprofilerCallback الواجهة) التي تسمح بإعادة كتابة أجسام طريقة MSIL قبل تجميعها في رمز التجميع بواسطة وقت التشغيل .NET. يتم ذلك بشكل خاص من خلال JitCompileStarted أتصل مرة أخرى.

في كل طريقة ، يقدم Moles طريقًا يشبه هذا:

static struct DateTime 
{
    static DateTime Now
    {
        get 
        {
            Func<DateTime> d = __Detours.GetDelegate(
                null, // this point null in static methods
                methodof(here) // current method token
                );
            if(d != null)
                return d();
            ... // original body
        }
    }
}

عندما تقوم بتعيين مول ، يتم تخزين مندوبك في قاموس __detours الأساسي الذي يتم البحث عنه عند تنفيذ الطريقة.

نصائح أخرى

هذا يعمل مثل الغلاف لأي مجموعة تريدها ، على سبيل المثال mscorlib (هذا المثال يستند إلى غلاف تجميع الشامات من mscorlib). هذا يعطي لك السلطة استبدل أي طريقة .NET بواسطة المندوب الذي كتبه المبرمج.

هذا لا يعمل Automagicaly. يجب عليك أولاً إنشاء قبل هذه البداية ، تكوين Moles XML ملف مع قائمة التجميعات إلى "Wrapper" وبهذا الرمز ، يقوم الشامات بإنشاء مراجع من هذا التجميع من ملف التكوين. ويجب أن تضيف في هذا الملف using namespace System.Moles, وقبل الوظيفة [HostType("Moles")]

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