3

我正在使用 PostSharp 拦截对我不拥有的对象的方法调用,但我的方面代码似乎没有被调用。Silverlight 区域的文档似乎很松散,所以我很感激你们能提供的任何帮助:)

我有一个看起来像这样的属性:

public class LogAttribute : OnMethodInvocationAspect
{
    public override void OnInvocation(MethodInvocationEventArgs eventArgs)
    {
        // Logging code goes here...
    }
}

我的 AssemblyInfo 中的一个条目如下所示:

[assembly: Log(AttributeTargetAssemblies = "System.Windows", AttributeTargetTypes = "System.Windows.Controls.*")]

所以,我对你的问题是......我错过了什么?匹配属性目标下的方法调用似乎不起作用。

4

4 回答 4

2

当前版本的 PostSharp 无法做到这一点。

PostSharp 通过在 CLR 加载之前转换程序集来工作。现在,为了做到这一点,必须做两件事:

  • 程序集必须即将加载到 CLR 中;你只能得到一个镜头,你必须在这一点上采取它。
  • 转换阶段完成后,您无法进行任何其他修改。这意味着您不能在运行时修改程序集。

最新版本 1.5 CTP 3消除了这两个限制中的第一个,但真正有问题的是第二个。然而,这是一个非常需要的功能,所以请注意:

用户经常询问是否可以在运行时使用 PostSharp,因此在编译时不必知道方面。部署后更改方面确实是一个很大的优势,因为它允许支持人员启用/禁用对软件各个部分的跟踪或性能监控。它可以实现的一件很酷的事情是在第三方程序集上应用方面。

如果你问是否可能,简短的回答是肯定的!不幸的是,长答案更复杂。

运行时/第三方方面的陷阱

作者还继续概述了如果您允许在运行时进行修改会发生的一些问题:

那么现在,有什么问题呢?

  • 插入引导程序。如果您的代码是托管的(例如在 ASP.NET 或 COM 服务器中),则不能插入引导程序。因此,任何运行时编织技术都受到您应该自己托管应用程序的限制。
  • 在 CLR 之前。如果 CLR 自己找到未转换的程序集,它不会要求转换的程序集。因此,您可能需要为转换后的应用程序创建一个新的应用程序域,并将转换后的程序集放在其二进制路径中。这也许不是什么大问题。
  • 强大的名字。哎呀。如果在运行时修改程序集,则必须删除其强名称。它会起作用吗?是的,主要是。当然,您必须从对该程序集的所有引用中删除强名称。这不是问题。PostSharp 开箱即用地支持它。但是有一些 PostSharp 无法解决的问题:如果在字符串或文件中(例如在 app.config 中)有一些强命名的引用,我们很难找到它们并对其进行转换。所以这里我们有一个真正的限制:不能有对强命名程序集的“松散引用”:我们只能转换真正的引用。
  • 加载自。如果任何程序集使用 Assembly.LoadFrom、Assembly.LoadFile 或 Assembly.LoadBytes,我们的引导程序将被跳过。
于 2009-03-16T10:15:25.677 回答
1

我相信如果您将 AttributeTargetAssemblies 更改为“PresentationFramework”,它可能会起作用。(还没有把 PostSharp 搞得那么好)。

WPF 的程序集是 PresentationFramework.dll。AttributeTargetAssemblies 需要它应该定位的 dll。

于 2008-09-18T22:47:23.697 回答
1

PostSharp 有一个新版本,可从下载页面链接访问“所有下载”。

PostSharp 1.5 PostSharp 的开发分支,包括支持 Mono、Compact Framework 或 Silverlight 以及方面继承等新功能。如果您想尝试新功能并通过测试新开发来帮助社区,并且可以接受 API 的可靠性和稳定性较差,请从此分支下载。

该版本目前为 1.5 CTP 3,但它支持 Silverlight。

于 2009-03-13T20:23:57.837 回答
0

如果您试图拦截框架内的调用(即,不在您自己的代码中),它将无法正常工作。PostSharp 只能替换您自己程序集中的代码。如果您试图拦截您正在拨打的电话,那么它看起来应该可以工作。您是否看到 PostSharp 在构建输出中运行?

于 2008-09-19T02:24:37.480 回答