Domanda

Moles è un quadro di isolamento creato da Microsoft. Una caratteristica interessante di talpe è che può / metodi non virtuali "finto" statiche e classi sigillate (che non è possibile con framework come Moq). Qui di seguito è la rapida dimostrazione di ciò che può fare 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);

Sembra Moles è in grado di modificare il corpo CIL di cose come DateTime.Now in fase di esecuzione. Dal momento che Moles non è open-source, sono curioso di sapere quale meccanismo Moles utilizza al fine di modificare i metodi CIL in fase di esecuzione. Qualcuno può capannone qualsiasi luce?

È stato utile?

Soluzione

Moles implementa un profiler CLR (in particolare la ICorProfilerCallback interfaccia) che permette di riscrivere corpi di metodo MSIL prima della compilazione in codice assembly dal runtime NET. Questo viene fatto in particolare attraverso il JitCompileStarted callback.

In ogni metodo, Moles introduce una deviazione che assomiglia a questo:

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
        }
    }
}

Quando si imposta una talpa, il delegato viene memorizzato nel dizionario __Detours sottostante, che viene cercato whenver viene eseguito il metodo.

Altri suggerimenti

Questo è il lavoro come come wrapper per qualsiasi assembly che si desidera, ad esempio mscorlib (questo esempio baseing su Moles Assemblea Wrapper di mscorlib). Questo dà a voi il potere di sostituire qualsiasi metodo .NET dal delegato scritto da coder .

Questo non funziona automagicaly. È necessario creare prima di questo inizio lavori, Moles XML di configurazione file con la lista delle Assemblee di "wrapper" e da questo codice Moles generare una riferimenti di questo assembiles dal file di configurazione. E si deve in questo file aggiuntivo using namespace System.Moles, e prima che la funzione [HostType("Moles")]

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top