2013-01-16 4 views
0

모든 .NET 프로젝트에 DLL 파일로 추가해야하는 클래스를 작성하고 있습니다. 나는 System.Diagnostics.StackTrace "last_method_name_changed"에 이벤트를 만들어야하는 시점에 갇혀있다.StackTrace VB.NET의 다른 클래스에 대한 Byref

그래서 StackTrace에서 변경 사항을 감지하거나 스레드가 메소드를 시작하거나 종료 할 때 발생하는 이벤트를 작성해야합니다. 뭔가 같은이 한 번만 호출해야 기본 폼에서

Public Class DllClass 
    Public Shared CallerTrace as StackTrace = Nothing 
    Public Shared New(ByRef NewTrace as StackTrace) 'This is called from form. 
     '''I know this will make a copy, but I have failed to find a solution. 
     CallerTrace = NewTrace 
    End Sub 
    Public Shared Sub StackTrace_Changed() Handles CallerTrace.Changed 
     MsgBox(CallerTrace.GetFrame(0).GetMethod.Name) 
    End Sub 
End Class 

:

Dim DllCls as New DllClass(New Diagnostics.StackTrace) 

내가 "참조 링크"또는 포인터 스택 트레이스와 의지 이벤트를 만드는 데 어떤 도움 감사합니다 CallerTrace.GetFrame(0).GetMethod.Name이 변경되면 인상됩니다.

답변

1

복사가 이루어지지 않으므로 StackTrace은 참조 유형입니다 (참조에 지정하면 기본 객체가 복사되지 않음). 매개 변수 선언에있는 ByRef은 관련이 없으며 중복되어 있습니다.

한편 CallerTraceWithEvents으로 선언하지 않았으므로 실제로 발생하는 이벤트를 수신하지 않았습니다. System.Diagnostics.StackTrace은 (는) 들으실 수있는 공개 이벤트가 없음을 선언하므로 작동하지 않습니다. 메소드 호출을 인터셉트하는 방식은 근본적으로 작동하지 않습니다.

당신이 상상할 수있는 방식으로 메소드 호출을 가로 채기 위해서는 더 많이 훈련해야합니다. 다행히 이미 허용하는 라이브러리가 있습니다 (예 : AOP library PostSharp).

+0

재생 해 주셔서 감사합니다. – user1983608

+0

나는 당신의 요지를 보지만 다른 질문이 있습니다. 예를 들어 백그라운드 스레드를 만들고 무한 루프를 작성하여 변경 사항을 StackTrace에 확인하십시오. 어떻게하면 현재 주 스레드에서 사용되는 메소드를 얻을 수 있습니까? – user1983608

+0

별도의 스레드에 대한 스택 추적을 얻을 수 있는지 여부는 알 수 없습니다. 사실 스택 오버플로에 대한 다른 대답은 [this is not] (http://stackoverflow.com/a/5307360/1968)를 나타냅니다. –