PostSharp:将建议应用于外部类型

PostSharp: Applying Advice to External Type

我正在尝试在使用 PostSharp 4.3.24 的 external/3rd 派对集会的调用站点切入点应用一些建议,但我 运行 遇到了一些问题。在最简单的示例中,我试图记录有关应用程序执行的所有 SQL 的一些信息。我的方法是将 OnMethodBoundaryAdvice 应用于所有 SQLCommand.Execute* 方法(我们不使用 BeginExecute* 方法提供的遗留异步模式,因此我有意不包括它们)。我已经尝试使用 PostSharp 解决方案配置文件(MySolution.pssln 文件)的 Multicast 部分以及以下等效的程序集范围的多播属性应用程序:

[assembly:Blah.Telemetry.Aspects.SqlCommandTelemetryAspect(
    AttributeTargetAssemblies = "System.Data", 
    AttributeTargetTypes = "System.Data.SqlClient.SqlCommand", 
    AttributeTargetMembers = "Execute*"
)]

我的方面声明目前看起来是这样的:

[MulticastAttributeUsage(AllowExternalAssemblies = true, Inheritance = MulticastInheritance.Multicast)]
[PSerializable]
public sealed class SqlCommandTelemetryAspect : OnMethodBoundaryAspect { /*...*/ }

我在 MulticastAttributeUsage 中尝试了目标类型、继承值等的各种组合,但每次都得到同样令人困惑的结果。

我遇到的问题是该建议仅适用于单个 SqlCommand 方法 (ExecuteReader)。我还需要将它应用于所有其他 Execute 方法(例如 ExecuteNonQuery)和所有重载。我也尝试过以 DbCommand.Execute* 为目标,其中包含其中一些重载的抽象定义。当我直接 taget ExecuteNonQuery (而不是使用通配符或正则表达式)时,我收到以下警告,暗示没有应用任何建议(反编译证实了这一点):

POSTSHARP : postsharp warning PS0131: The project 'Blah.Framework.dll' does not contain any aspect or other transformation[...]

我是不是做错了什么或者这是 PostSharp 中的错误?

相关错误已在 PostSharp 4.3.26 中修复。现在可以使用方面提供程序将 OnMethodBoundary 和 MethodInterception 方面应用到外部程序集中的抽象方法。

例如:

[assembly:MyAspectProvider(
    AttributeTargetAssemblies = "System.Data", 
    AttributeTargetTypes = "System.Data.Common.DbCommand", 
    AttributeTargetMembers = "Execute*"
)]

[PSerializable]
public class MyAspectProvider : MethodLevelAspect, IAspectProvider
{
    public IEnumerable<AspectInstance> ProvideAspects(object targetElement)
    {
        yield return new AspectInstance(targetElement, new MyAspect());
    }
}

[PSerializable]
public class MyAspect : OnMethodBoundaryAspect
{
    public override void OnEntry(MethodExecutionArgs args)
    {
        // ...
    }
}