【问题标题】:StackTrace ByRef to another class in VB.NETStackTrace ByRef 到 VB.NET 中的另一个类
【发布时间】:2013-01-16 13:11:25
【问题描述】:

我正在编写一个类,它必须作为 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 更改时将引发的事件的任何帮助。

【问题讨论】:

    标签: vb.net class events dll pass-by-reference


    【解决方案1】:

    没有复制,因为StackTrace 是一个引用类型(分配给引用不会复制底层对象)。参数声明中的ByRef是无关的,是多余的。

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

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

    【讨论】:

    • 我明白你的意思,但我还有另一个问题。例如,如果我创建后台线程,并放入无限循环来检查 StackTrace 是否有更改。如何获取当前在主线程中使用的方法?
    • 我不知道你是否可以得到一个单独线程的堆栈跟踪。事实上,Stack Overflow 上的其他答案表明 this is not possible.
    猜你喜欢
    • 1970-01-01
    • 2021-08-26
    • 2012-01-21
    • 1970-01-01
    • 2015-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多