C# 我可以用堆栈跟踪检索实际的代码行吗?

C# 我可以用堆栈跟踪检索实际的代码行吗?,c#,stack-trace,C#,Stack Trace,我为我的ASP.NET应用程序提供了一个快速而肮脏的单元测试框架——一个ASPX页面,其中包含一个比较预期结果和实际结果并创建表的方法。它可以根据需要进行编译,让我能够快速创建和运行一系列测试,即使没有运行VS.NET 下面是一个示例调用: PrintResult( expected: "$A$1", actual: RST.ExcelReference.FormatReferences("{{REF:1:0:1:0}}", false, 0, 0), argumen

我为我的ASP.NET应用程序提供了一个快速而肮脏的单元测试框架——一个ASPX页面,其中包含一个比较预期结果和实际结果并创建表的方法。它可以根据需要进行编译,让我能够快速创建和运行一系列测试,即使没有运行VS.NET

下面是一个示例调用:

PrintResult(
   expected:  "$A$1", 
   actual:    RST.ExcelReference.FormatReferences("{{REF:1:0:1:0}}", false, 0, 0),
   arguments: "RST.ExcelReference.FormatReferences(\"{{REF:1:0:1:0}}\", false, 0, 0)");
(为了清晰起见,添加了命名参数。)

正如您所想象的,同步实际呼叫和该呼叫的显示是一件痛苦的事情

我知道我无法在
环境.StackTrace
中检查参数值,只能检查方法定义和行号。但在我的例子中,我不需要实际的参数值。我通常使用文本作为参数来调用这个方法,所以我只需要堆栈跟踪中PrintResult()入口点的一行源代码


源代码似乎在某种程度上可供ASP.NET使用,就像出现未处理的异常时一样。如何访问它?

环境。StackTrace
为您提供堆栈跟踪每行中的文件名和行号。它的格式清晰,应该易于解析。发件人:

StackTrace属性为每个堆栈设置堆栈跟踪信息的格式 方法调用如下所示:

“在FileName:line中的FullClassName.MethodName(MethodParams)处 行号“

文字“at”前面有三个空格,文字“in” 如果调试符号不可用,则省略“:行”。这个 占位符、FullClassName、MethodName、MethodParms、文件名和 行号,由定义如下的实际值替换:

FullClassName类的全名,包括名称空间

MethodName方法的名称

MethodParms参数类型/名称对的列表。每对都是 由逗号(“,”)分隔。如果MethodName 接受零参数

FileName方法所在的源文件的名称 宣布。如果未使用调试符号,则忽略此信息 可用

LineNumber文件名中包含源的行号 调用堆栈上指令的MethodName中的代码。 如果调试符号不可用,则忽略此信息


在问题中,您暗示
Environment.StackTrace
不是您问题的答案,但似乎您应该能够解析出源文件名和行号,然后从文件中读取该行。我错过了什么?

这正是我目前正在做的事情。。。将ASPX的源代码(Request.PhysicalPath)读入字符串列表,并打印帧的
GetFileLineNumber()-1
行。直接阅读源代码似乎有点奇怪,认为可能有一种更优雅的方式。(我实际上使用的是
新系统.Diagnostics.StackTrace(true)
,而不是
环境.StackTrace
,因此不需要解析字符串。)