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

5 ответов

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

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

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

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

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

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

Да, ты можешь

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

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

Попробуйте инъекцию зависимости?

Изменить C, чтобы:

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

    public D Override
}

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

Другие вопросы по тегам