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

hrirmatl  于 2023-03-31  发布在  C#
关注(0)|答案(2)|浏览(147)

我正在试用C# source generators。我花了大约一天的时间在上面,我发现这是一个非常令人沮丧和痛苦的经历。IntelliSense非常不可靠。它偶尔能工作,但大多数情况下都不能,我无法找到任何系统。(重新启动Visual Studio没有帮助。)
但更根本的是,我在调试生成的代码中的错误时遇到了很大的麻烦。当我在源代码生成器中的模板中出错并试图编译时,我可能会在生成的文件中得到像“方法必须有返回类型”这样的错误。但当我双击错误时,它不会带我到生成的代码。这使得很难看到它有什么问题。
有什么诀窍吗?有什么方法可以在生成的代码无法编译时检查它吗?更一般地说,* 什么决定了生成的代码何时可用于IntelliSense,何时不可用 *?
我正在使用Visual Studio Professional 2022版本17.1.6和ReSharper 2022.1。
先谢谢你了!

bweufnob

bweufnob1#

将以下内容添加到代码生成器构造函数代码中:

#if DEBUG 
    if (!Debugger.IsAttached) 
    { 
        Debugger.Launch(); 
    } 
#endif

现在您可以在Visual Studio中使用断点。
在VS中,Intellisense确实是一个垃圾。你需要关闭VS,删除/bin和/obj文件夹,重新打开VS,然后重建。每次你做更改时都必须这样做。VS会在你更改一些东西后显示旧版本,intellisense会将新的东西标记为错误,但它仍然会编译和运行...
为了获得更好的体验,我建议使用Rider,它对代码生成器有更好的集成体验。

dphi5xsq

dphi5xsq2#

我找到了解决我的问题的部分办法。
首先,* 在使用源代码生成器时,不要使用Visual Studio* 中的ReSharper构建器。它不会给予正确的错误消息。相反,从命令行运行dotnet build。这样你会得到更好的错误消息。
事实上,我的部分问题可能是由于ReSharper中的bug或限制(尽管我没有调查过这一点,所以这纯粹是猜测)。
第二,* 您可以测试源代码生成器的内部结构,而无需在编译时运行源代码生成 *。
1.重构你的源代码生成器并提取一个helper类(我们可以称之为SourceGeneratorHelper.cs),它接受你的输入(例如XML)并产生输出(例如StringBuilder)。
1.创建一个单独的C#测试项目SourceGeneratorHelperTest.csproj,用于测试类SourceGeneratorHelper.cs。在该项目中,引用您的源代码生成器项目,就像它是一个常规项目一样-即不要在项目引用中使用OutputItemType="Analyzer"
1.现在您可以对源代码生成器的内部进行单元测试,也可以将生成的C#代码转储到一个文件中并检查它。
此外,正如NightOwl 888所指出的,我可以将其添加到引用项目中,以使其将生成的文件吐出到磁盘(如本文所述):

<PropertyGroup>
    <EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
</PropertyGroup>

我还没有解决智能感知的问题,但现在我至少可以忍受与这个生成器一起工作。

相关问题