2017-10-24 16 views
0

콘솔 응용 프로그램 A는 =>이 유틸리티 메소드는 콘솔에 로그인하는 것입니다 클래스 라이브러리 BPostsharp - 외부 라이브러리, 내부 통화 로그 - # C를

[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

@ Antonín Procházka 내 생각은 무엇입니까? –

답변

0

두 PostSharp이 방법을 향상하는 방법이었다.

1) 메서드가 선언 된 어셈블리의 메서드에 애스펙트를 적용하면 메서드 자체가 향상되고 다른 어셈블리에서 호출 할 때도 메서드를 호출 한 곳 어디에서나 향상된 기능이 작동합니다.

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 우편 분포 (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 패키지에서 찾을 수 있습니다.) ClassLibraryB.dllClassLibraryB.Instrumented.dll으로 바꾸고 다른 프로젝트 옆에 PostSharp.dll을 복사하십시오.

이제 클래스 라이브러리에있는 모든 메소드의 모든 메소드 호출이 인스트루먼트되어야합니다.

PostSharp는 미리 작성된 로깅 구현과 함께 제공되므로 사용자가 직접 로깅 논리를 작성할 필요가 없습니다. http://doc.postsharp.net/logging을 참조하십시오.

+0

MyClassLibrary의 소스 코드에 액세스 할 수 있으며 동일한 프로젝트의 일부입니다. 내 콘솔 앱과 MyClassLibrary 모두 NuGet을 사용하여 PostSharp에 대한 참조를 추가했습니다. 1 ~ 4 단계를 실행해야합니까? 소스 코드에 액세스 할 수 있습니까? 그런데 MyClassLibrary에 포스트 샤프 참조를 추가해도 문제가 해결되지 않았습니다. 제발 조언을 –

+0

나는 내 대답을 업데이 트했습니다, 나는 그것이 지금 분명 희망. 그리고 아니요, PostSharp를 클래스 라이브러리 프로젝트에 추가하면 옵션 b)의 단계를 따를 필요가 없습니다. –