Postsharp - 记录外部库,内部调用 - c#

时间:2017-10-24 13:44:37

标签: logging postsharp

控制台应用A =>参考类库B

[assembly: LogExecutionTime(AttributePriority = 1,
AttributeTargetExternalTypeAttributes = MulticastAttributes.AnyAbstraction | MulticastAttributes.AnyVisibility | MulticastAttributes.AnyImplementation,
AttributeTargetElements = MulticastTargets.Method, AttributeTargetAssemblies = "MyClassLibrary")]

namespace MyConsoleApp
{       
    public class A
    {
        static void Main(string[] args)
        {
            B b1 = new B();
            b.Func1();
        }
    }
}
//class library referenced within same project
namespace MyClassLibrary
{
    public class B
    {
        public void Func1()
        {
            // Do something
            InternalFunc2();
        }

        public void InternalFunc2()
        {
            // Do something else
        }   
    }
}

这是登录控制台的实用工具方法。

[Serializable]
public sealed class LogExecutionTimeAttribute : OnMethodBoundaryAspect
{
    private static readonly Stopwatch timer = new Stopwatch();

    public override void OnEntry(MethodExecutionArgs args)
    {
        args.MethodExecutionTag = Stopwatch.StartNew();
    }

    public override void OnExit(MethodExecutionArgs args)
    {
        var sw = (Stopwatch)args.MethodExecutionTag;
        sw.Stop();
        Console.WriteLine(args.Method.Name + ":" + sw.Elapsed.TotalMilliseconds);
    }
}

我只记录Func1,但不记录“InternalFunc2”。如何在外部库中启用内部函数调用的记录?

谢谢, Maneesh

1 个答案:

答案 0 :(得分:1)

PostSharp如何增强方法。

1)如果将方面应用于程序集中的方法(声明方法),则方法本身会得到增强,然后增强就可以在调用方法的任何地方运行,即使从其他程序集中调用它也是如此。 p>

2)如果将方面应用于程序集中的方法(未声明方法),则只增强程序集中的方法调用,因此如果在其他程序集中调用相同的方法,则不应用方面,没有增强。

因此,您遇到问题的原因是您正在检测的唯一程序集是Console App程序集。因此,PostSharp仅对外部调用Func1()方法,而不是方法本身,也不管其他程序集中的任何其他方法。

这里有两个选项:

a)如果您有权访问类库的源代码:

1)在类库项目中安装PostSharp NuGet包。

2)您的问题中的示例显示您正在将LogExecutionTime方面应用于从控制台应用程序到类库的方法调用。从控制台应用程序中删除它并在类库中应用。它看起来像这样:

[assembly: LogExecutionTime(AttributePriority = 1,
   AttributeTargetExternalTypeAttributes = 
     MulticastAttributes.AnyAbstraction
      | MulticastAttributes.AnyVisibility
      | MulticastAttributes.AnyImplementation,
   AttributeTargetElements = MulticastTargets.Method)]

您不需要在此处指定程序集,因为您将在类库程序集中包含此代码。

像这样,PostSharp将增强类库的方法,因此只要您从控制台应用程序调用它们,就会在调用方法时发生日志记录。

b)如果您没有源代码,您仍然可以使用PostSharp命令行界面检测类库的程序集。 (只有PostSharp 4.3及更高版本支持此功能,如上所述。)

文档:http://doc.postsharp.net/command-line

在你的情况下:

1)从https://www.postsharp.net/downloads/下载PostSharp ZIP发行版(PostSharp-.zip)。

2)使用以下内容创建文件postsharp.config

<Project xmlns="http://schemas.postsharp.org/1.0/configuration">
  <Property Name="Input" Value="ClassLibraryB.dll" />
  <Property Name="Output" Value="ClassLibraryB.Instrumented.dll" />
  <SearchPath Path="C:\Path\MyAspects" />
  <Multicast>
    <LogExecutionTimeAttribute xmlns="clr-namespace:MyAspectsNS;assembly:MyAspects" />
  </Multicast>
</Project>

您需要根据命名和路径编辑文件。

  • ClassLibraryB.dll是您的类库的原始程序集。
  • ClassLibraryB.Instrumented.dll将是您的类库程序集的检测版本。
  • MyAspectsNSLogExecutionTimeAttribute方面所在的命名空间。
  • MyAspectsLogExecutionTimeAttribute方面所在的程序集名称。
  • C:\Path\MyAspectsMyAspects.dll程序集所在的目录。

3)执行tools\postsharp-net40-x86-native.exe postsharp.config。 (此可执行文件位于步骤1的ZIP包中。)

4)将ClassLibraryB.dll替换为ClassLibraryB.Instrumented.dll,并将PostSharp.dll复制到项目的其他程序集旁边。您可以在步骤1的ZIP包的lib目录中找到它。

现在应该对类库中任何方法的所有方法调用进行检测。

请注意,PostSharp附带现成的日志记录实现,因此您无需自己编写日志记录逻辑。请参阅http://doc.postsharp.net/logging