如何获取源文件名和类型成员的行号?

时间:2020-03-06 14:38:59  来源:igfitidea点击:

考虑到调试数据文件可用(PDB)并通过使用System.Reflection或者其他类似的框架(如Mono.Cecil),如何以编程方式检索源文件名和类型或者类型成员所在的行号宣布。

例如,假设我们已将此文件编译为程序集:

C:\ MyProject \ Foo.cs

1:    public class Foo
2:    {
3:       public string SayHello()
4:       {
5:           return "Hello";
6:       }
7:    }

如何做类似的事情:

MethodInfo methodInfo = typeof(Foo).GetMethod("SayHello");
string sourceFileName = methodInfo.GetSourceFile(); // ?? Does not exist!
int sourceLineNumber = methodInfo.GetLineNumber(); // ?? Does not exist!

sourceFileName将包含" C:\ MyProject \ Foo.cs",并且sourceLineNumber等于3.

更新:System.Diagnostics.StackFrame确实能够获取该信息,但仅在当前正在执行的调用堆栈范围内。这意味着必须首先调用该方法。我想获取相同的信息,但不调用type成员。

解决方案

我们可能会在这些链接上找到一些帮助:

在不部署PDB文件的情况下获取文件和行号
也发现了以下帖子

"嗨,马克,

以下内容将为我们提供代码的行号(在
源文件):

Dim CurrentStack As System.Diagnostics.StackTrace
MsgBox (CurrentStack.GetFrame(0).GetFileLineNumber)

如果我们有兴趣,可以了解自己喜欢的套路
以及所有呼叫者。

Public Function MeAndMyCaller As String
    Dim CurrentStack As New System.Diagnostics.StackTrace
    Dim Myself As String = CurrentStack.GetFrame(0).GetMethod.Name
    Dim MyCaller As String = CurrentStack.GetFrame(1).GetMethod.Name
    Return "In " & Myself & vbCrLf & "Called by " & MyCaller
End Function

如果我们想要通用错误例程,这可能非常方便,因为它
可以获取调用方的名称(即发生错误的位置)。

问候,
弗格斯
MVP [Windows开始按钮,关闭对话框]
"

以下URL上的代码示例提供了一个类,我们可以轻松地对其进行修改以获取所需的信息:

http://blogs.msdn.com/rmbyers/pages/code-sample-stacktrace-with-manual-symbol-lookup.aspx

通过使用CCI元数据项目提供的PDB阅读器,可以提取给定类型成员的代码位置。请参阅OSS Gallio项目的源代码中的示例实现。