摩尔是由微软创建的隔离框架。摩尔的清凉特征是,它可以“模拟”静止/非虚拟方法和密封类(这是不可能的像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")]

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top