Pergunta

Toupeiras é uma estrutura de isolamento criada pela Microsoft. Uma característica legal das moles é que ela pode "zombar" de métodos estáticos/não virtuais e classes seladas (o que não é possível com estruturas como MOQ). Abaixo está a rápida demonstração do que as toupeiras podem fazer:

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 é capaz de modificar o corpo CIL de coisas como DateTime.Now em tempo de execução. Como o Moles não é de código aberto, estou curioso para saber quais mecanismos moles usam para modificar o CIL dos métodos em tempo de execução. Alguém pode lançar alguma luz?

Foi útil?

Solução

Moles implementa um perfilador de CLR (em particular o Icorprofilercallback interface) que permite reescrever corpos do método MSIL antes de serem compilados no código de montagem pelo tempo de execução .NET. Isso é feito em particular através do JitCompilestarted ligue de volta.

Em cada método, Moles introduz um desvio que se parece com o seguinte:

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 você define uma toupeira, seu delegado é armazenado no dicionário __detours subjacente que é procurado quando o método é executado.

Outras dicas

Isso está funcionando como o invólucro para qualquer assembléia que desejar, por exemplo mscorlib (Este exemplo baseando -se em toupeiras de montagem de moles de mscorlib). Isso dando a você poder para Substitua qualquer método .NET pelo delegado escrito por codificador.

Isso não está funcionando automágica. Você deve primeiro criar antes que este início funcione, Moles XML Configuração Arquivo com lista de assemblies para "wrapper" e por este código as moles geram referências deste conjunto do arquivo de configuração. E você deve neste arquivo adicionar using namespace System.Moles, e antes da função [HostType("Moles")]

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top