有没有类似于#pragma的指令可以将生成的C#代码与模板代码的行号匹配?

11

我有一个模板系统,类似于旧款ASP代码。 我将其通过一个类运行,该类将整个内容重写为C#源代码,编译,最后执行。

我想知道是否有一种类似于#pragma的指令,可以在生成的C#代码中添加,使得编译错误能够匹配模板文件中的行号?

例如,假设我在模板代码中有这个唯一的第一行:

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

但是为了编译它,我必须添加一个命名空间、一个类、一个方法和一些样板代码,因此这行代码,原本是我的模板文件中的第1行,实际上最终成为C#代码中的第17行(只是举例说明的随机数字)。编译器错误会自然地将我的错误标记为第17行,而不是第1行。

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

C# 3.5 中是否有类似的东西?

1个回答

18

您有#line预处理器指令

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

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

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

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

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


@Jared:有一天我在查看生成的WPF代码时发现了它,然后就像这样 :hmm: :) 它是将错误链接到源XAML文件的东西。 - Sam Harwell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接