Question

taupes est un cadre d'isolement créé par Microsoft. Une caractéristique de fraîcheur de grains de beauté est qu'il peut méthodes statiques / non virtuels « moquerie » et des classes scellées (ce qui est impossible avec des cadres comme QMC). Voici la démonstration rapide de ce que les taupes peuvent faire:

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

On dirait Moles est capable de modifier le corps de CIL des choses comme DateTime.Now lors de l'exécution. Depuis taupes ne sont pas open source, je suis curieux de savoir quel mécanisme Moles utilise pour modifier le CIL de méthodes lors de l'exécution. Quelqu'un peut-il nous éclairer?

Était-ce utile?

La solution

Moles met en œuvre un profileur CLR (en particulier le ICorProfilerCallback interface) qui permet de réécrire les corps de méthode MSIL avant qu'ils ne sont compilés dans le code assembleur par le moteur d'exécution .NET. Cela se fait notamment par le JitCompileStarted rappel.

Dans chaque méthode, Moles introduit un détour qui ressemble à ceci:

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

Lorsque vous définissez un grain de beauté, votre délégué est stocké dans le dictionnaire __Detours sous-jacente qui obtient regardé whenver la méthode est exécutée.

Autres conseils

Cela fonctionne comme comme emballage à tout ensemble que vous voulez, par exemple mscorlib (cet exemple baseing sur l'Assemblée taupes Wrapper de mscorlib). Cela donne à vous pouvoir remplacer toute méthode .NET par le délégué écrit par le codeur .

Ce ne fonctionne pas automagiquement. Vous devez d'abord créer avant le fonctionnement de ce début, Moles configuration XML fichier avec la liste des assemblées à « wrapper » et par ce code Moles générer une référence de ce assembiles à partir du fichier de configuration. Et vous devez dans ce fichier ajouter using namespace System.Moles, et avant que la fonction [HostType("Moles")]

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top