0

我正在编写一个类,它必须作为 dll 文件添加到任何 .NET 项目中。我陷入了困境,我需要向 System.Diagnostics.StackTrace “last_method_name_changed” 发起事件。

所以我需要找到一种方法来检测 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)

对于制作“参考链接”或指向 StackTrace 的指针以及在CallerTrace.GetFrame(0).GetMethod.Name更改时将引发的事件的任何帮助,我将不胜感激。

4

1 回答 1

1

没有复制作为StackTrace引用类型(分配给引用不会复制基础对象)。参数声明中的ByRef是无关的和多余的。

另一方面,您没有声明CallerTraceWithEvents因此您实际上并没有收听它引发的任何事件。但这不起作用,因为System.Diagnostics.StackTrace声明没有可以收听的公共事件。您拦截方法调用的方法根本不起作用。

要以您设想的方式拦截方法调用,您需要进一步钻取。幸运的是,有些库已经允许这样做,例如AOP 库 PostSharp

于 2013-01-16T13:48:22.193 回答