【发布时间】:2016-03-04 18:36:19
【问题描述】:
我想为我的 MVC 应用程序编写某种调试工具,该应用程序托管在生产托管环境中,我的访问权限非常有限,除了将每一行代码写入 .txt 文件之外,我无法调试代码。例如,假设我有一个代码:
public void Foo()
{
var bar = new Bar();
var baz = new Baz();
bar.Qux(baz);
}
我现在实际上在做的是:
public void Foo()
{
MyTxtDebugger.Write("Enter Foo()")
MyTxtDebugger.Write("var bar = new Bar();")
var bar = new Bar();
MyTxtDebugger.Write("var baz = new Baz();")
var baz = new Baz();
MyTxtDebugger.Write("bar.Qux(baz);")
bar.Qux(baz);
MyTxtDebugger.Write("Exit Foo()")
}
MyTxtDebugger.Write 是我的自定义简单文本编写器。这种做法确实可行,但我想让代码更简洁,并且不要将实际代码行复制到字符串中。我想要的是这样的:
public void Foo()
{
[MyTxtDebugger] var bar = new Bar();
[MyTxtDebugger] var baz = new Baz();
[MyTxtDebugger] bar.Qux(baz);
}
或者至少是这样的:
public void Foo()
{
MyTxtDebugger.Write(); var bar = new Bar();
MyTxtDebugger.Write(); var baz = new Baz();
MyTxtDebugger.Write(); bar.Qux(baz);
}
我希望MyTxtDebugger.Write() 的输出为"MyTxtDebugger.Write(); var bar = new Bar();"。 这可能吗?如果可以,怎么做?我已经研究过,例如,this question,但在这种情况下,实际的 C# 代码没有在输出中捕获。
【问题讨论】:
-
但是
"MyTxtDebugger.Write(); var bar = new Bar();"是 2 行代码,不是吗?我认为您将获得的最接近的方法是使用 PostSharp 和 decorate 方法来记录对每个方法的调用。在方法级别,这是可能的。但不要在执行时打印每一行。 -
@hometoast 这些是 2 条语句,但在同一行代码中。我希望 MyTxtDebugger.Write() 获取调用它的行。
-
如果你将声明和赋值分成两行,你会怎么做?或者类似多行的 linq 查询?我只是要求这些来说明为什么不存在像您要求的那样的东西。必须修改 Visual Studio 调试器并通过该调试器运行整个程序。
-
@hometoast 对于多行语句,再次捕获调用 .Write() 的行。如果它包含 linq,则输出将类似于 "MyTxtDebugger.Write(); var bar = items.Select()" 并忽略 linq 的其余部分。
-
@KiroYakuza OP 不要求提供行号!这不是重复的问题。