代码之家  ›  专栏  ›  技术社区  ›  Buu

如何实现moles隔离框架?

  •  22
  • Buu  · 技术社区  · 14 年前

    Moles 是由Microsoft创建的隔离框架。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可以改变CIL的主体 DateTime.Now 在运行时。因为moles不是开源的,所以我很好奇moles使用哪种机制在运行时修改方法的cil。有人能发光吗?

    2 回复  |  直到 12 年前
        1
  •  49
  •   Peli    14 年前

    Moles实现了一个CLR分析器(尤其是 ICorProfilerCallback 接口)允许在.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
            }
        }
    }
    

    设置mole时,委托存储在底层的迂回字典中,该字典在执行方法时被查找。

        2
  •  0
  •   Svisstack    14 年前

    例如,它的工作方式类似于您想要的任何程序集的包装器。 mscorlib (本示例基于 麦克斯利布 )这给了你权力 用编码器编写的委托替换任何.NET方法 .

    这不能自动工作。必须先创建,然后才能开始工作, MOLES XML配置 文件中包含要“包装”的程序集列表,通过此代码,moles将从配置文件生成此程序集的引用。你必须在这个文件中添加 using namespace System.Moles ,在函数之前 [HostType("Moles")]

    推荐文章