4

假设我有以下 .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 方法的方法。

4

5 回答 5

4

Microsoft 已经创建了一个与 Detours 等效的托管方法,称为Moles。我唯一不确定的是许可。它用于测试(作为 Pex 的一部分)。

依赖注入需要修改源码;PostSharp 需要修改二进制文件;但是 Moles 可以在运行时动态完成。

于 2010-06-29T23:35:37.257 回答
3

主要有两种可能的方法 - 代理对象或挂钩调用。

可以使用Castle Dynamic Proxy或任何类似的动态代理框架来完成代理。挂钩调用既可以通过PostSharp之类的面向方面的编程来完成,也可以通过Isolator之类的黑魔法来完成(它是为单元测试而设计的,但它可能像所有其他技术一样(ab)使用)

于 2010-06-29T23:12:03.040 回答
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

于 2012-09-24T10:25:48.037 回答
1

试试依赖注入

将 C 修改为:

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

    public D Override
}

如果您需要更大的灵活性,请从 D 类中提取接口。

于 2010-06-29T22:53:37.450 回答
1

我怀疑你可以用PostSharp做一些 IL 编织。

我也确实找到了这篇关于使用其他工具的好文章:http: //blog.andreloker.de/post/2009/02/14/Simple-AOP-call-interception-with-DynamicProxy.aspx

于 2010-06-29T22:53:09.400 回答