是否有一个方面编织器可以修改方法实现没有明确的切入点?

时间:2014-06-07 01:51:13

标签: .net aop

是否有任何实用的方法来修补深埋在没有触及类型/成员的唯一签名的方法中的业务逻辑片段?

如果基本实现(在仅二进制组件中)的结构如下:

class PastaPlate
{
    int mode;
    double increment;
    bool fullTiltBoogieMode;

    void Loop()
    {
        while(true)
        {
            // 1000 lines of spaghetti, which may or may not mutate mode
            if (mode == 7) increment = 42.0;
            if (mode == 13) increment = -0.666;
            if (mode == 8) increment = 64.0;
            if (mode == 666) increment = -0.666;
            // 1000 more lines of spaghetti which depend on mode and increment
        }
    }
}

假设我想在if之后在mode上引入另一个if (mode == 8)语句,或修改if (mode == 13)的结果以更改increment的值而不修改if (mode == 666)。是否有一个方面weaver或其他IL修改工具可以支持这种痛苦的用例?

2 个答案:

答案 0 :(得分:0)

一种选择是使用可以反编译为完整项目的反编译器(例如:justdecompile),修改项目中的内容并重新编译它。

答案 1 :(得分:0)

我已经采取了写这些类型的方法的方法(我毫不犹豫地将它们称为方面,因为有些方面非常适用,因为它们是道德上的等同于猴子补丁),因为它是直截了当的Cecil - 基于控制台的应用程序:读入目标程序集,浏览元数据和IL,根据需要进行修改,然后将修改后的程序集写回。

Fody本质上提供了一个MSBuild扩展点,用于运行Cecil amenders的管道,这在项目构建的上下文中很有用,但对于修补第三方二进制文件则不太重要。