gpt4 book ai didi

c# - Moles Isolation 框架是如何实现的?

转载 作者:IT王子 更新时间:2023-10-29 04:29:14 26 4
gpt4 key购买 nike

Moles是微软创建的隔离框架。 Moles 的一个很酷的特性是它可以“模拟”静态/非虚拟方法和密封类(这对于像 Moq 这样的框架是不可能的)。下面是 Moles 可以做什么的快速演示:

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

似乎 Moles 能够在运行时修改诸如 DateTime.Now 之类的 CIL 主体。由于 Moles 不是开源的,我很想知道 Moles 使用哪种机制来在运行时修改方法的 CIL。任何人都可以阐明吗?

最佳答案

Moles 实现了一个 CLR 探查器(特别是 ICorProfilerCallback 接口(interface)),允许在 .NET 运行时将它们编译成汇编代码之前重写 MSIL 方法体。这是通过 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
}
}
}

当你设置一个地鼠时,你的委托(delegate)存储在底层的 __Detours 字典中,每当执行该方法时都会查找它。

关于c# - Moles Isolation 框架是如何实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3021797/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com