Frage

Moles ist ein Isolations Framework von Microsoft erstellt. Ein cooles Feature von Moles ist, dass es „mock“ static / nicht-virtuelle Methoden und versiegelte Klassen (die nicht mit Frameworks wie Moq ist). Unten ist die schnelle Demonstration, was Moles tun können:

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

Scheint, wie Moles in der Lage, den CIL Körper Dinge wie DateTime.Now zur Laufzeit zu ändern. Da Moles nicht Open Source ist, bin ich neugierig zu wissen, welcher Mechanismus Moles verwendet, um Methoden CIL zur Laufzeit zu ändern. Kann jemand Schuppen kein Licht?

War es hilfreich?

Lösung

Moles implementiert eine CLR-Profiler (insbesondere die ICorProfilerCallback Schnittstelle) das ermöglicht MSIL Methodenrümpfe neu zu schreiben, bevor sie von der .NET-Laufzeit in Assembler-Code kompiliert werden. Dies wird insbesondere durch die JitCompileStarted Rückruf.

Bei jedem Verfahren führt Moles einen Umweg, dass sieht wie folgt aus:

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

Wenn Sie einen Maulwurf gesetzt, Ihre Stellvertretung in dem zugrundeliegenden __Detours Wörterbuch gespeichert ist, nachgeschlagen wird whenver das Verfahren ausgeführt wird.

Andere Tipps

Dies funktioniert wie als Wrapper für jede Baugruppe Sie zum Beispiel mscorlib (dieses Beispiel baseing auf Moles Assembly Wrapper von mscorlib) wollen. Dies gibt Ihnen Kraft zu ersetzen jede .NET-Methode durch den Delegierten geschrieben von Coder .

Das funktioniert nicht automagicaly. Sie müssen zuerst erstellen, bevor dieser Start funktioniert, Moles XML-Konfiguration Datei mit einer Liste von Baugruppen zu „Wrapper“ und durch diesen Code Moles ein Referenz dieser assembiles aus Config-Datei zu erzeugen. Und Sie müssen in dieser Datei hinzufügen using namespace System.Moles und vor Funktion [HostType("Moles")]

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top