C# 源代码生成器:如何调试生成代码中的编译器错误?

Cla*_*pel 6 c# code-generation visual-studio sourcegenerators

我正在尝试使用C# 源生成器。我花了大约一天的时间,我发现这是一次非常令人沮丧和痛苦的经历。IntelliSense 极其不可靠。它偶尔会起作用,但大多数情况下不会起作用,而且我无法找出任何系统。(重新启动 Visual Studio 没有帮助。)

但更根本的是,我在调试生成的代码中的错误时遇到了很大的麻烦。当我在源生成器中的模板中犯错误并尝试编译时,我可能会在生成的文件中收到诸如“方法必须有返回类型”之类的错误。但是当我双击错误时,它不会将我带到生成的代码。这使得很难看出它出了什么问题。

有什么窍门吗?当编译失败时,有什么方法可以检查生成的代码吗?更一般地说,生成的代码何时可用于 IntelliSense,何时不可用,由什么决定

我使用的是 Visual Studio Professional 2022 版本 17.1.6 和 ReSharper 2022.1。

提前致谢!

Cla*_*pel 1

我已经找到了解决我的问题的部分方法。

首先,使用源生成器时不要在 Visual Studio 中使用 ReSharper 生成器。它不会给出正确的错误消息。相反,dotnet build从命令行运行。这样你会得到更好的错误消息。

事实上,我的部分问题可能是由于 ReSharper 中的错误或限制造成的(尽管我还没有调查过这一点,所以这纯粹是猜测)。

其次,您可以测试源代码生成器的内部结构,而无需在编译时运行源代码生成

  1. 重构您的源生成器并提取一个帮助器类(我们可以将其称为SourceGeneratorHelper.cs),该类接受您的输入(例如 XML)并生成输出(例如StringBuilder)。
  2. 创建一个单独的 C# 测试项目SourceGeneratorHelperTest.csproj来测试类SourceGeneratorHelper.cs。在此项目中,像常规项目一样引用您的源生成器项目 - 即,请勿OutputItemType="Analyzer"在项目引用中使用。
  3. 现在您可以对源生成器的内部进行单元测试。您还可以将生成的 C# 代码转储到文件中并检查它。

此外,正如 NightOwl888 指出的那样,我可以将其添加到引用项目中,以便让它将生成的文件吐出到磁盘( 如本文所述):

<PropertyGroup>
    <EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

我还没有解决 IntelliSense 问题,但现在我至少可以忍受使用这个生成器。