控制台应用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
答案 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
将是您的类库程序集的检测版本。MyAspectsNS
是LogExecutionTimeAttribute
方面所在的命名空间。MyAspects
是LogExecutionTimeAttribute
方面所在的程序集名称。C:\Path\MyAspects
是MyAspects.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。