如何痣隔离框架中实现?
-
26-09-2019 - |
题
摩尔是由微软创建的隔离框架。摩尔的清凉特征是,它可以“模拟”静止/非虚拟方法和密封类(这是不可能的像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体在运行时。由于痣是不开源的,我很好奇,想知道哪些机构痣,以便在运行时修改方法CIL使用。任何人都可以棚任何光?
解决方案
痣器具一个CLR分析器(特别是 ICorProfilerCallback 接口)允许重写MSIL方法主体它们由.NET运行时编译成汇编代码之前。这在特别是通过 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
}
}
}
当您设置一个摩尔,您的代理被存储在whenver执行方法,该方法被抬头底层__Detours字典。
其他提示
这是工作等作为包装到所需的任何组件,例如mscorlib
(上mscorlib
的摩尔装配包装这个例子baseing)。这给予你功率为替代任何.NET通过编码器强>
此不automagicaly工作。您必须在此之前开始的作品首次创建的痣XML配置的一起“包装”大会列表,并通过这个代码痣生成配置文件这个assembiles的参考文件。你必须在这个文件中添加using namespace System.Moles
,和之前的功能[HostType("Moles")]
不隶属于 StackOverflow