代码之家  ›  专栏  ›  技术社区  ›  Gabriel Isenberg

使用PostSharp拦截对Silverlight对象的调用?

  •  3
  • Gabriel Isenberg  · 技术社区  · 16 年前

    我正在使用Postshap拦截对我不拥有的对象的方法调用,但是我的方面代码似乎没有被调用。在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 回复  |  直到 16 年前
        1
  •  2
  •   John Feminella    15 年前

    这在当前版本的Postharp中是不可能的。

    Postshap通过在由clr加载之前转换程序集来工作。现在,要做到这一点,必须发生两件事:

    • 程序集必须即将加载到CLR中;只有一个快照,此时必须进行该操作。
    • 转换阶段完成后,不能再进行任何修改。这意味着您不能在运行时修改程序集。

    最新版本,1.5 CTP 3, removes the first of these two limitations 但这是第二个真正的问题。然而,这是, a heavily requested feature ,所以要把眼睛剥皮:

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

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

    运行时/第三方方面Gotchas

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

    那么现在,有什么问题?

    • 插入引导程序。 如果您的代码是托管的(例如 ASP.NET或在COM服务器中),您 无法插入引导程序。所以任何 运行时编织技术 你应该主持的限制 应用程序。
    • 在CLR之前。 如果clr自己找到未转换的程序集, 它不会要求改造 一个。所以你可能需要创建一个新的 转换后的应用程序域 应用程序,并将其转换为 其二进制路径中的程序集。它是 也许不是什么大问题。
    • 强名称。 Ough。如果在运行时修改程序集,则必须 删除其强名称。它会起作用吗? 是的,大部分是。当然,你必须 删除所有强名称 对此程序集的引用。那是 没问题,Postshap支持 开箱即用。但是有一些东西 Postshap无法帮助:如果有 中是否有一些强名称引用 字符串或文件(例如 app.config),我们很难找到它们 然后改造它们。所以这里我们有一个 真正的局限:不可能 对强名称的“松散引用” 集会:我们只能 转换实际引用。
    • LoadFrom。 如果任何程序集使用assembly.loadfrom、assembly.loadfile 或assembly.loadbytes,我们的 跳过引导程序。
        2
  •  1
  •   MagicKat    16 年前

    我相信如果您将attributeTargetAssemblies更改为“PresentationFramework”,它可能会起作用。(现在还没把竖琴降下来)。

    wpf的程序集是presentationframework.dll。attributeTargetAssemblies需要它应该针对的dll。

        3
  •  1
  •   Bryan Bailliache    15 年前

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

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

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

        4
  •  0
  •   Joel Lucsy    16 年前

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