Могу ли я перенаправить вызовы метода .NET на новый метод во время выполнения?

Предположим, у меня есть следующие классы .NET:

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

а также

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

Эти 2 класса находятся в разных пространствах имен, в разных сборках. Есть ли способ вызвать все призывы кC.M() «перенаправить» автоматическиD.N()? Таким образом, вызывающий метод вызывает егоC.M, но на самом деле,D.N это то, что на самом деле вызывается, с любыми параметрами, которыеC.M взял бы. Не имеет значения, происходит ли это для всех экземпляров класса или только для одного конкретного объекта.

MS Research имеетБиблиотека обходов это может сделать что-то очень похожее для обычного экспорта Win32 DLL. Я ищу способ сделать это с помощью метода .NET.