0

如果您反汇编 C#,您经常会看到编译器插入的临时变量,其名称如下:

CS$1$0000

但是什么会导致它们出现在调试器的本地/自动窗格中?

我的一位同事正在尝试维护一个使用Rhino ETL编写的工具。他的程序集的符号被调试器报告为正确加载。他可以单步执行代码。但不是在调试器中显示他的变量,而是只显示内部编译器生成的变量。

我建议他尝试使用相同的代码编写一个新的控制台应用程序,并替换调用的虚拟类AbstractOperationRow满足编译器的要求(这些是来自 Rhino ETL 库的类)。当他尝试删除对 Rhino ETL 的所有依赖项时,一切都恢复正常,在调试器中看到他自己的变量。

他还尝试在同一解决方案中从源代码构建 Rhino ETL,但这并没有解决问题。所以显然这不是由于版本不兼容。

他的代码位于迭代器方法中,因此编译器需要对代码进行重大重组。但是迭代器方法通常不会破坏调试器!

override在这种情况下,如果它是一个迭代器方法并且基类AbstractOperation来自 Rhino ETL 库,它似乎会破坏调试器。

基类如何对调试器产生这样的影响?

4

1 回答 1

0

显然 PostSharp 也参与其中,它重写了 IL,当移除对 PostSharp 的依赖后,问题就消失了。谜团已揭开。

于 2009-12-01T10:39:09.613 回答