2010-06-11 18 views
22

Moles माइक्रोसॉफ्ट द्वारा निर्मित एक अलगाव फ्रेमवर्क है। मोल्स की एक अच्छी सुविधा यह है कि यह स्थैतिक/गैर-वर्चुअल विधियों और मुहरबंद वर्गों ("मोक जैसे ढांचे के साथ संभव नहीं है)" नकल कर सकता है। नीचे मोल्स क्या कर सकते हैं की त्वरित प्रदर्शन है:कैसे मोल्स अलगाव ढांचे को लागू किया जाता है?

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); 

लगता मोल्स की तरह रनटाइम पर DateTime.Now तरह बातें की कोल इंडिया शरीर को संशोधित करने में सक्षम है। चूंकि मोल्स ओपन-सोर्स नहीं है, इसलिए मुझे यह जानकर उत्सुकता है कि रनटाइम पर विधियों के सीआईएल को संशोधित करने के लिए कौन सी तंत्र मोल्स का उपयोग करता है। क्या कोई किसी तरह की रोशनी दिखा सकता है?

+4

मैं आपको पेपे और मोल्स के काम के बारे में बताते हुए @ पेली के इन 3 वीडियो को देखने की अत्यधिक अनुशंसा करता हूं। वें बहुत अच्छे हैं! [वीडियो भाग 1] (http://channel9.msdn.com/Blogs/channel9spain/Microsoft-PEXMOLES-- उन्नत- Unit-Testing-aspect-13 "माइक्रोसॉफ्ट पेक्स/MOLES और उन्नत यूनिट-परीक्षण पहलू 1/3") ; [वीडियो भाग 2] (http://channel9.msdn.com/Blogs/channel9spain/Microsoft-PEXMOLES-- उन्नत- Unit-Testing-aspects-23 "माइक्रोसॉफ्ट PEX/MOLES और उन्नत यूनिट-परीक्षण पहलुओं 2/3") ; [वीडियो भाग 3] (http://channel9.msdn.com/Blogs/channel9spain/Microsoft-PEXMOLES-- उन्नत- Unit-Testing-aspects-33 "माइक्रोसॉफ्ट पेक्स/MOLES 3/3") –

उत्तर

49

से पहले मोल्स एक CLR प्रोफाइलर को लागू करता है कि MSIL विधि निकायों के पुनर्लेखन के लिए इससे पहले कि वे .NET रनटाइम द्वारा विधानसभा कोड में संकलित कर रहे हैं अनुमति देता है (विशेष रूप से ICorProfilerCallback इंटरफ़ेस में)। यह विशेष रूप से JitCompileStarted कॉलबैक के माध्यम से किया जाता है।

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 शब्दकोश में संग्रहीत किया जाता है जो ऊपर देखा जाता whenver विधि निष्पादित होने

प्रत्येक विधि में, मोल्स एक चक्कर है कि इस तरह दिखता है प्रस्तुत करता है।

+4

+1 वास्तव में विस्तार के लिए यह कैसे काम करता है। मैं भी उत्सुक था। यह जानकर अच्छा लगा कि वास्तव में डीबग मोड में एक विधि को फिर से लिखने का एक तरीका है;) – TomTom

+0

मेरे द्वारा +1 भी - मैं सोच रहा था कि उन्होंने यह कैसे किया और इस पर पीछा किया - यह भी समझ में आता है। –

+1

मैं आपको पेपे और मोल्स के काम के बारे में बताते हुए @ पेली के इन 3 वीडियो को देखने की अत्यधिक अनुशंसा करता हूं। वें बहुत अच्छे हैं! [वीडियो भाग 1] (http://channel9.msdn.com/Blogs/channel9spain/Microsoft-PEXMOLES-- उन्नत- Unit-Testing-aspect-13 "माइक्रोसॉफ्ट पेक्स/MOLES और उन्नत यूनिट-परीक्षण पहलू 1/3") ; [वीडियो भाग 2] (http://channel9.msdn.com/Blogs/channel9spain/Microsoft-PEXMOLES-- उन्नत- Unit-Testing-aspects-23 "माइक्रोसॉफ्ट PEX/MOLES और उन्नत यूनिट-परीक्षण पहलुओं 2/3") ; [वीडियो भाग 3] (http://channel9.msdn.com/Blogs/channel9spain/Microsoft-PEXMOLES-- उन्नत- Unit-Testing-aspects-33 "माइक्रोसॉफ्ट पेक्स/MOLES 3/3") –

0

यह किसी भी असेंबली के लिए रैपर के रूप में काम कर रहा है, उदाहरण के लिए mscorlib (यह उदाहरण mscorlib के मोल्स असेंबली रैपर पर आधारित है)। यह आपको को पावर देने के लिए कोडर द्वारा लिखे गए प्रतिनिधि द्वारा किसी भी .NET विधि को प्रतिस्थापित करता है।

यह ऑटोमैटिकल काम नहीं कर रहा है। आपको पहले इस काम के काम से पहले बनाना होगा, मोल्स एक्सएमएल कॉन्फ़िगरेशन फ़ाइल "रैपर" में असेंबली की सूची के साथ फ़ाइल और इस कोड द्वारा मोल्स कॉन्फ़िगरेशन फ़ाइल से इस असेंबली का संदर्भ उत्पन्न करते हैं। और अगर आप इस फ़ाइल में using namespace System.Moles जोड़ना होगा, और समारोह [HostType("Moles")]

संबंधित मुद्दे