我正在使用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.*")]
所以,我的问题是......我错过了什么?匹配属性目标下的方法调用似乎不起作用。
答案 0 :(得分:2)
目前的PostSharp版本无法做到这一点。
PostSharp通过在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在构建输出中运行了吗?