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

时间:2008-09-18 22:41:55

标签: c# postsharp

我正在使用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 个答案:

答案 0 :(得分:2)

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

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

  • 必须将组件装入CLR;你只得到一枪,你必须在这一点上接受它。
  • 转换阶段完成后,您无法进行任何其他修改。这意味着您无法在运行时修改程序集。

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

  

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

     

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

运行时/第三方方面陷阱

作者还将概述在运行时允许修改时发生的一些问题:

  

现在,问题是什么?

     
      
  • 插入引导程序。如果您的代码是托管的(例如在   ASP.NET或在COM服务器中),你   无法插入引导程序。所以任何   运行时编织技术必然会受到影响   您应该托管的限制   应用程序自己。
  •   
  • 在CLR之前。如果CLR自己找到未转换的程序集,   它不会要求改造   一。所以你可能需要创建一个新的   转换后的应用程序域   应用,并把改造   二进制路径中的程序集。它的   也许不是一个大问题。
  •   
  • 强名。哎哟。如果在运行时修改程序集,则必须执行此操作   删除它的强名称。它会起作用吗?   是的,主要是。当然,你必须这样做   从所有人中删除强名称   对此程序集的引用。那是   不是问题; PostSharp支持它   盒子外面。但有一些东西   PostSharp无法帮助:如果有的话   是一些强烈命名的参考文献   字符串或文件(例如在   app.config),我们很难找到它们   并改造它们。所以我们有一个   真正的局限:不可能   强烈命名的“松散参考”   集会:我们只能   转换真实参考。
  •   
  • LoadFrom。如果任何程序集使用Assembly.LoadFrom,Assembly.LoadFile   或者Assembly.LoadBytes,我们的   跳过bootstrapper。
  •   

答案 1 :(得分:1)

我相信如果你将AttributeTargetAssemblies更改为“PresentationFramework”,它可能会有效。 (还没有那么好的PostSharp)。

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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

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