如何获取源文件名和类型成员的行号?
时间: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项目的源代码中的示例实现。