Код, который вы показали, работает точно так, как ожидалось. Он печатает номер строки, где вы захватили кадр стека. Поскольку вы определили его в другом классе, он печатает номер строки файла, который содержит этот класс.
Здесь важен GetFrame
метод. Кадры стека нумеруются, начиная с 0, то есть последнего стекаемого кадра последний . Таким образом, обращаясь к кадру 0, вы указываете среде выполнения выводить номер строки в последнем кадре стека, который был передан. Когда один метод вызывает другой, создается новый кадр стека.
Вместо этого вам нужно изменить свой метод несколькими важными способами. Во-первых, вам нужно получить первый кадр, который был помещен в стек. И, во-вторых, вы, вероятно, хотите принять параметр, содержащий информацию об исключении, на которое вы отвечаете. Попробуйте переписать ваш метод отладки, чтобы он выглядел примерно так:
Public Sub PrintCurrentLine(ByVal ex As Exception)
Dim st As StackTrace = New StackTrace(ex)
Dim sf As StackFrame = st.GetFrame(st.FrameCount - 1)
Console.WriteLine("Line " & sf.GetFileLineNumber())
End Sub
Также помните, что если вы запускаете код с включенной оптимизацией, такие вещи, как номера строк, могли измениться. Вам всегда нужно включать файл PDB с вашим кодом, который содержит отладочную информацию, которая используется в подобных ситуациях. Он отображает оптимизированный код обратно в ваш исходный код.