Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# PostSharp:将建议应用于外部类型_C#_.net_Aop_Postsharp - Fatal编程技术网

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

C# PostSharp:将建议应用于外部类型,c#,.net,aop,postsharp,C#,.net,Aop,Postsharp,我试图在使用PostSharp 4.3.24的外部/第三方程序集中的调用站点切入点应用一些建议,但我遇到了一些问题。在最简单的示例中,我试图记录有关应用程序执行的所有SQL的一些信息。我的方法是将OnMethodBoundaryAdvice应用于所有SQLCommand.Execute*方法(我们不使用BeginExecute*方法提供的传统异步模式,因此我有意不包括它们)。我使用PostSharp解决方案配置文件(MySolution.pssln文件)的多播部分以及以下等效的程序集范围多播属性

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

[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
)。我还需要将它应用于所有其他执行方法(例如,
ExecuteNonQuery
)和所有重载。我还尝试了定位
DbCommand.Execute*
,其中包含一些重载的抽象定义。当我直接标记ExecuteNonQuery(而不是使用通配符或regex)时,我得到以下警告,暗示没有应用任何建议(反编译证实了这一点):

POSTSHARP:POSTSHARP警告PS0131:项目“Blah.Framework.dll”不包含任何方面或其他转换[…]


我是否做错了什么,或者这可能是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)
    {
        // ...
    }
}
[程序集:MyAspectProvider(
AttributeTargetAssemblys=“System.Data”,
AttributeTargetTypes=“System.Data.Common.DbCommand”,
AttributeTargetMembers=“执行*”
)]
[可序列化]
公共类MyAspectProvider:MethodLevelAspect,IAspectProvider
{
公共IEnumerable ProvideSpects(对象targetElement)
{
返回新AspectInstance(targetElement,newMyAspect());
}
}
[可序列化]
公共类MyAspect:OnMethodBoundaryAspect
{
public override void OnEntry(MethodExecutionArgs args)
{
// ...
}
}

在调用站点切入点应用方面时,需要注意C#编译器如何发出该方法调用。在本例中,它是对
System.Data.Common.DbCommand.ExecuteNonQuery()
的虚拟调用。但是这里的另一个问题是,
OnMethodBoundaryAspect
不能应用于抽象方法。当将方面应用于方法体时,这个限制是正确的,但是对于调用站点切入点,取消它也是有意义的。一旦我们有了更多关于这个问题的信息,我们会给你回复的。@AlexD啊,我明白了;谢谢你的信息。因此,它对调用站点应用了与在声明切入点编织相同的约束。我在想,这可能与外部编织似乎是对最初不是为外部目标设计的东西的扩展有关。同时有没有其他方法来声明调用站点切入点?我正试图在工作中的一个项目中使用这一点,这是一个大的近期目标,以证明AOP@AlexD很抱歉,也许这不是问这个问题的最佳地点,但我认为我们现在正在获得许可证批准,因此我尚未获得正确支持渠道所需的信息无问题,我们也会监控这些问题。响应时间可能较慢。无论如何,没有其他方法可以建议呼叫站点切入点。我们将实现一个修复程序,它将启用一些具有抽象方法目标的用例。@AlexD非常好,谢谢。是否有问题追踪器或某个我可以关注的地方,以查看何时可以开始使用此修复程序?现在假期结束了,我将尝试找出我们的许可证在哪里等等,但是我对基于project.json的csproj也有一些问题,我想知道是否有发布时间表之类的地方可以看到?再次感谢