22

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

DateTime.NowMoles は実行時に CIL 本体を変更できるようです。Moles はオープンソースではないので、実行時にメソッドの CIL を変更するために Moles がどのメカニズムを使用しているか知りたいです。誰でも光を当てることができますか?

4

2 に答える 2

49

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
        }
    }
}

ほくろを設定すると、デリゲートは基になる __Detours ディクショナリに格納され、メソッドが実行されるたびに検索されます。

于 2010-06-18T08:42:35.773 に答える
0

これは、たとえば、必要なアセンブリへのラッパーのように機能しますmscorlib(この例は、の Moles Assembly Wrapper に基づいていmscorlibます)。これにより、任意の .NET メソッドを coder によって作成されたデリゲートに置き換えることができます。

これは自動的に機能しません。この開始が機能する前に、「ラッパー」へのアセンブリのリストを含むMoles XML構成ファイルを最初に作成する必要があります。このコードにより、Molesは構成ファイルからこのアセンブリの参照を生成します。using namespace System.Molesそして、このファイルで、関数の前に , を追加する必要があります[HostType("Moles")]

于 2010-06-11T09:56:45.910 に答える