Родинки являются платформой изоляции, созданной 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 методов во времени выполнения. Кто-либо может пролить какой-либо свет?
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, который просматривается при выполнении метода.
Это работает как оболочка для любой сборки, которую вы хотите, например mscorlib
(этот пример основан на оболочке Moles Assembly Wrapper из mscorlib
). Это дает вам право заменить любой метод .NET на делегат, написанный кодером .
Это не работает автоматически. Прежде чем этот запуск заработает, вы должны сначала создать XML-файл конфигурации Moles со списком сборок для «Wrapper», и с помощью этого кода Moles сгенерируют ссылки на эти сборки из файла конфигурации. И вы должны в этом файле добавить , используя пространство имен System.Moles
, и перед функцией [HostType ("Moles")]