11

我有一个看起来类似于旧式 ASP 代码的模板系统。我通过一个将整个东西重写为 C# 源代码、编译并最终执行它的类来运行它。

我想知道是否有某种类似#pragma 的指令我可以将生成的C# 代码洒在上面,这将使编译错误与我的模板文件中的行号相匹配?

例如,假设我的模板代码中有第一行也是唯一一行:

Object o = datta; // should be data, compiler error

但是为了编译它,我必须添加一个命名空间、一个类、一个方法和一些样板代码,所以上面的这一行,即我的模板文件中的第 1 行,实际上最终是第 17 行(随机数,仅用于说明目的)在 C# 代码中。编译器错误自然会将我的错误标记为第 17 行,而不是第 1 行。

我记得我以前使用过的另一种编程语言(虽然我不记得是哪一种)它有一个可以添加的指令,它可以使错误行号对齐。

C# 3.5 中有这样的东西吗?

4

1 回答 1

18

你有#line预处理器指令

#line允许您修改编译器的行号和(可选)错误和警告的文件名输出。

#line directive可以在构建过程中的自动化中间步骤中使用。例如,如果从原始源代码文件中删除了行,但您仍希望编译器根据文件中的原始行编号生成输出,则可以删除行,然后使用#line.

#line hidden指令对调试器隐藏了连续的行,这样当开发人员单步执行代码时,a#line hidden和 next#line指令之间的任何行(假设它不是另一个 #line 隐藏指令)都将被跳过。此选项还可用于允许 ASP.NET 区分用户定义的代码和机器生成的代码。尽管 ASP.NET 是此功能的主要使用者,但很可能会有更多的源代码生成器使用它。

#line hidden指令不会影响错误报告中的文件名或行号。也就是说,如果在隐藏块中遇到错误,编译器会报告错误的当前文件名和行号。

#line filename指令指定要出现在编译器输出中的文件名。默认情况下,使用源代码文件的实际名称。文件名必须用双引号 ("") 括起来,并且前面必须有一个行号。

于 2009-08-31T17:39:28.653 回答