Могу ли я перенаправить вызовы метода .NET на новый метод во время выполнения? - PullRequest
4 голосов
/ 30 июня 2010

Предположим, у меня есть следующие классы .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 имеет библиотеку Detours , которая может сделать нечто очень похожее для обычного экспорта Win32 DLL. Я ищу способ сделать это с помощью метода .NET.

Ответы [ 5 ]

5 голосов
/ 30 июня 2010

Microsoft создала управляемый эквивалент Detours под названием Moles .Единственное, в чем я не уверен - это лицензирование;он предназначен для тестирования (как часть Pex).

Внедрение зависимостей требует модификации источника;PostSharp требует изменения бинарного файла;но родинки могут быть сделаны динамически во время выполнения.

3 голосов
/ 30 июня 2010

Существует в основном два возможных подхода - проксирование объектов или перехват вызовов.

Прокси может быть выполнен с использованием Castle Dynamic Proxy или любой аналогичной среды динамического прокси. Перехват вызовов может быть выполнен с помощью аспектно-ориентированного программирования с использованием чего-то вроде PostSharp или даже с помощью черной магии, подобной Isolator (он предназначен для модульного тестирования, но, вероятно, может быть (ab ) используется как и все другие технологии)

2 голосов
/ 30 июня 2010

Я подозреваю, что вы могли бы сделать несколько IL-ткачества с PostSharp .

Я нашел эту хорошую статью об использовании других инструментов: http://blog.andreloker.de/post/2009/02/14/Simple-AOP-call-interception-with-DynamicProxy.aspx

1 голос
/ 24 сентября 2012

Да, вы можете

Пожалуйста, посмотрите это http://www.codeproject.com/Articles/463508/Net-CLR-Injection-Modify-IL-Codes-on-Run-time

Вы можете сделать это, изменив код IL во время выполнения

1 голос
/ 30 июня 2010

Попробуйте Внедрение зависимостей ?

Измените C на:

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

    public D Override
}

Если вам нужна большая гибкость, Извлечение интерфейса из класса D.

...