Вопрос

Моли это структура изоляции, созданная Microsoft. Крутая особенность родингов состоит в том, что она может «высмеивать» статические / не виртуальные методы и герметичные классы (что невозможно с фреймворками, такими как MOQ). Ниже приведена быстрая демонстрация того, какие моющие могут сделать:

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

Похоже, родинки могут изменить корпус силой вещей, таких как DateTime.Now во время выполнения. Поскольку моли не являются открытым источником, мне любопытно узнать, какие моль механизма используют для изменения методов CIL во время выполнения. Кто-нибудь может пролить любой свет?

Это было полезно?

Решение

Родинки реализуют профилировщик CLR (в частности Icorprofilercallback. Интерфейс), который позволяет перезаписать тела MSIL MSIL, прежде чем они будут скомпилированы в код сборки .NET Runtime. Это делается в частности через Jitcompilestarted перезвонить.

В каждом способе родинки представляют собой обход, который выглядит так:

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

Когда вы устанавливаете моль, ваш делегат хранится в базовом словаре __detours, который посмотрел вверх при выполнении метода.

Другие советы

Это работает как как обертка для любой сборки, которую вы хотите, например mscorlib (Этот пример, основанный на молью монтажную обертку mscorlib). Это дает вам власть Замените любой метод .NET с помощью делегата, написанного CODER.

Это не работает автоматически. Вы должны сначала создать до этого запуска, Моль XML конфигурация Файл со списком сборки в «Wrapper», и этим кодом моль генерируют ссылки на эти анталлеры из файла конфигурации. И вы должны в этом файле добавить using namespace System.Moles, и до функции [HostType("Moles")]

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top