4

Suppose I have the following .NET classes:

public class C
{
    public void M()
    {
        ....
    }
}

and

public class D
{
    public void N()
    {
        ....
    }
}

These 2 classes reside in different namespaces, in different assemblies. Is there a way to cause all call to C.M() to 'redirect' automatically to D.N()? So, the calling method things its invoking C.M, but in reality, D.N is what actually gets called, with any parameters that C.M would have taken. It doesn't matter if this happens for all instantiations of the class, or just for one specific object.

MS Research has the Detours Library that can do something very similar for normal Win32 DLL exports. I'm looking for a way to do this with a .NET method.

5 Answers5

4

Microsoft has created a managed equivalent to Detours called Moles. The only thing I'm not sure of is the licensing; it is intended for testing (as part of Pex).

Dependency injection requires modifying the source; PostSharp requires modifying the binary; but Moles can be done dynamically at runtime.

Stephen Cleary
  • 376,315
  • 69
  • 600
  • 728
  • Moles looks promising. A quick test should determine whether its technically appropriate for this usage or not. If so, I'll accept this. –  Jun 30 '10 at 00:36
  • Moles is freely available for commercial use by MSDN licensees - hooray! – code4life Jun 30 '10 at 02:08
3

There are mainly two possible approaches - proxying the objects or hooking the calls.

Proxying can be done using Castle Dynamic Proxy or any similar dynamic proxy framework. Hooking the calls can either be done with aspect oriented programming with something like PostSharp or even by black magic like done by Isolator (it is designed for unit testing but it can probably be (ab)used like all other technologies)

Daniel Brückner
  • 56,191
  • 15
  • 92
  • 137
1

Yes you can

Please see this http://www.codeproject.com/Articles/463508/Net-CLR-Injection-Modify-IL-Codes-on-Run-time

You can do that by modifying the IL code on runtime

Mr.Wang from Next Door
  • 10,685
  • 10
  • 47
  • 76
1

I suspect you could do some IL weaving with PostSharp.

I did find this nice article on using other tools too : http://blog.andreloker.de/post/2009/02/14/Simple-AOP-call-interception-with-DynamicProxy.aspx

Preet Sangha
  • 61,126
  • 17
  • 134
  • 202
  • I'll check out LOOM.NET, mentioned in that blog post. That also looks promising. –  Jun 30 '10 at 01:01
1

Try Dependency Injection?

Modify C to:

public class C
{
    public void M()
    {
        if (Override != null) { Override.N(); }
        else {
            ....
        }
    }

    public D Override
}

If you need more flexibility, Extract Interface from class D.

Adrian Godong
  • 8,366
  • 8
  • 37
  • 62