Pregunta

Moles es un marco de aislamiento creado por Microsoft. Una característica interesante de Moles es que puede / métodos no virtuales "mock" estáticas y clases sellados (lo que no es posible con marcos como Moq). A continuación se muestra la demostración rápida de lo que puede hacer 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);

Parece que Moles es capaz de modificar el cuerpo del CIL cosas como DateTime.Now en tiempo de ejecución. Dado que los lunares no es de código abierto, tengo curiosidad de saber qué mecanismo Moles utiliza para modificar métodos CIL en tiempo de ejecución. ¿Alguien puede arrojar alguna luz?

¿Fue útil?

Solución

implementos Moles un perfilador de CLR (en particular la ICorProfilerCallback interfaz) que permite reescribir MSIL cuerpos de los métodos antes de que se compilan en código ensamblador por el tiempo de ejecución de .NET. Esto se realiza, en particular, a través de la JitCompileStarted devolución de llamada.

En cada método, Moles introduce un desvío que es similar al siguiente:

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

Cuando se establece un lunar, el delegado se almacena en el diccionario __Detours subyacente que consigue alzó whenver se ejecuta el método.

Otros consejos

Esto funciona igual que como envoltura para cualquier montaje que desee, por ejemplo mscorlib (este ejemplo baseing en Moles ensamblado de contenedor de mscorlib). Esto da a usted de alimentación en reemplazar cualquier método .NET por el delegado escrito por codificador .

Esto no está funcionando automagicaly. Primero debe crear antes de este comienzo de obras, Moles XML de configuración archivo con la lista de conjuntos de "contenedor" y por este código Moles generan unas referencias de este assembiles de archivo de configuración. Y tienen que añadir en este archivo using namespace System.Moles, y antes de [HostType("Moles")] función

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top