繁体   English   中英

我可以在运行时将 .NET 方法调用重定向到新方法吗?

[英]Can I redirect .NET method calls to a new method at runtime?

假设我有以下 .NET 类:

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

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

这 2 个类驻留在不同的命名空间中,在不同的程序集中。 有没有办法让所有对CM()的调用自动“重定向”到DN() 因此,调用方法是调用CM ,但实际上, DN是实际被调用的,带有CM将采用的任何参数。 这是否发生在类的所有实例化或仅发生在一个特定对象上都没有关系。

MS Research 有Detours 库,它可以为正常的 Win32 DLL 导出做一些非常相似的事情。 我正在寻找一种使用 .NET 方法的方法。

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

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


更新: Moles 已移至 Visual Studio 本身; 它在企业版中可用,现在称为Microsoft Fakes

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

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

是的你可以

请参阅此http://www.codeproject.com/Articles/463508/Net-CLR-Injection-Modify-IL-Codes-on-Run-time

您可以通过在运行时修改 IL 代码来做到这一点

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

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

试试依赖注入

将 C 修改为:

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

    public D Override
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM