Как платформа Изоляции Родинок реализована?

Родинки являются платформой изоляции, созданной Microsoft. Замечательная функция Родинок - то, что это может "дразнить" static/non-virtual методы и запечатанные классы (который не возможен с платформами как 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);

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

22
задан abatishchev 23 April 2012 в 08:44
поделиться

2 ответа

Moles реализует профилировщик CLR (в частности, интерфейс ICorProfilerCallback ), который позволяет переписывать тела методов MSIL до того, как они будут скомпилированы в ассемблерный код средой выполнения .NET. Это делается, в частности, с помощью обратного вызова JitCompileStarted .

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

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, который просматривается при выполнении метода.

49
ответ дан 29 November 2019 в 04:17
поделиться

Это работает как оболочка для любой сборки, которую вы хотите, например mscorlib (этот пример основан на оболочке Moles Assembly Wrapper из mscorlib ). Это дает вам право заменить любой метод .NET на делегат, написанный кодером .

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

0
ответ дан 29 November 2019 в 04:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: