如何实施Moles隔离框架?

Moles是Microsoft创建的隔离框架。 Moles的一个很酷的function是它可以“模拟”静态/非虚拟方法和密封类(这对于像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接口),它允许在.NET运行时将MSIL方法体编译成汇编代码之前重写它们。 这通过JitCompileStarted回调特别完成。

在每种方法中,Moles引入了一个如下所示的绕道:

 static struct DateTime { static DateTime Now { get { Func d = __Detours.GetDelegate( null, // this point null in static methods methodof(here) // current method token ); if(d != null) return d(); ... // original body } } } 

设置痣时,您的代理将存储在基础__Detours字典中,该字典在执行方法时会被查找。

这就像你想要的任何程序集的包装一样,例如mscorlib (这个例子基于mscorlib Moles Assembly Wrapper)。 这使您有权通过编码器编写的代理替换任何.NET方法

这不是自动生效的。 您必须首先在此开始之前创建,将Moles XML配置文件与程序集列表添加到“Wrapper”,并通过此代码Moles从配置文件生成此集合的引用。 并且您必须在此文件中添加using namespace System.Moles ,并在函数[HostType("Moles")]