Postsharp 第三方类

5

我需要对第三方DLL中的所有类方法进行装饰。我使用C# 5.0和PostSharp 3.1。当然,我可以像这样做。

//In 3rd party library
class A
{
    public virtual int foo(string a) {}

    public virtual void foo2() {}
}

//In my
class B : A
{
    public override int foo(string a) {
        int result = base.foo(a);
        //Do something
        return result;
    }

    public override void foo2() {
        base.foo2();
        //Do something
    }
}

做某件事情总是一样的。
我不想复制所有的方法,因为那很丑陋。有什么想法我可以使用或Google吗?谢谢。


除非有所改变,PostSharp在编译时起作用,这意味着您需要从源代码重新编译该程序集。如果您无法做到这一点,那么只能进行反汇编和手动修改,或者您可以重新实现它。 - Lasse V. Karlsen
真的没有其他选项来包装所有方法吗? - user3805826
你可以在自己的项目中创建 shim 对象,这些对象在方法和属性方面模仿真实对象,只需调用底层真实对象即可,并在 shim 方法中执行操作。但是,这意味着您必须确保不直接在任何地方使用真实对象,而只能使用 shim 对象。 - Lasse V. Karlsen
你可以在自己的项目中创建 shim 对象,这些对象在方法和属性方面模仿真实对象,只需调用底层真实对象即可,并在 shim 方法中执行操作。但是,这意味着您必须确保不直接在任何地方使用真实对象,而只能使用 shim 对象。@LasseV.Karlsen - user3805826
主要是我必须按照问题中的示例编写所有方法。 我理解你的意思了吗?@LasseV.Karlsen - user3805826
4个回答

3

假设你创建了一个OnMethodBoundary aspect,以在方法结尾添加一些自定义代码:

[Serializable]
public class MyTestAttribute : OnMethodBoundaryAspect
{
    public override void OnSuccess(MethodExecutionArgs args)
    {
        // Do something.
    }
}

如果要将此方面应用于第三方程序集,您可以在项目中应用它,并将AttributeTargetAssemblies属性设置为第三方程序集的名称。这将导致PostSharp修改您的程序集并使用自定义代码装饰对第三方程序集的调用。

[assembly: MyTest(AttributeTargetAssemblies = "SomeLibrary")]

感谢您也包含了 XML 参考。 - dwp4ge

1
我想这将是使用Castle Dynamic Proxy的一个好案例。
如果第三方类没有被密封(即允许继承和目标方法或属性是多态的),则应该能够创建运行时代理(即运行时派生类)。
最后,您将创建一个工厂方法,返回整个第三方类的代理实例。

1
PostSharp在CIL级别上工作,因此可以使用命令行工具(postsharp.4.0-x86.exe)织入方面到几乎任何程序集中。
步骤如下:
postsharp.4.0-x86 /X:MyDependency.PostSharp.config MyDependency.dll

配置文件是常规的PostSharp配置文件(例如.pssln和.psproj):

http://doc.postsharp.net/configuration-schema

然而,对于第三方库的许可证需要小心谨慎。
编辑:顺便说一句 - 这种情况并没有得到PostSharp的官方支持 - 所以如果遇到任何问题,你需要自行解决。

1

您可以使用PostSharp文档称为方法拦截的技术。它通过修改您的代码,在调用第三方代码的位置插入额外的代码,而不是触及第三方代码。


仅使用方法拦截在这种情况下将不够。如果您需要拦截方法调用,则必须通过PostSharp修改该方法本身。要仅拦截对第三方代码的调用而不触及第三方程序集,可以在应用属性时使用AttributeTargetAssemblies属性。 - AlexD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接