我正在试用C# source generators。我花了大约一天的时间在上面,我发现这是一个非常令人沮丧和痛苦的经历。IntelliSense非常不可靠。它偶尔能工作,但大多数情况下都不能,我无法找到任何系统。(重新启动Visual Studio没有帮助。)
但更根本的是,我在调试生成的代码中的错误时遇到了很大的麻烦。当我在源代码生成器中的模板中出错并试图编译时,我可能会在生成的文件中得到像“方法必须有返回类型”这样的错误。但当我双击错误时,它不会带我到生成的代码。这使得很难看到它有什么问题。
有什么诀窍吗?有什么方法可以在生成的代码无法编译时检查它吗?更一般地说,* 什么决定了生成的代码何时可用于IntelliSense,何时不可用 *?
我正在使用Visual Studio Professional 2022版本17.1.6和ReSharper 2022.1。
先谢谢你了!
2条答案
按热度按时间bweufnob1#
将以下内容添加到代码生成器构造函数代码中:
现在您可以在Visual Studio中使用断点。
在VS中,Intellisense确实是一个垃圾。你需要关闭VS,删除/bin和/obj文件夹,重新打开VS,然后重建。每次你做更改时都必须这样做。VS会在你更改一些东西后显示旧版本,intellisense会将新的东西标记为错误,但它仍然会编译和运行...
为了获得更好的体验,我建议使用Rider,它对代码生成器有更好的集成体验。
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所指出的,我可以将其添加到引用项目中,以使其将生成的文件吐出到磁盘(如本文所述):
我还没有解决智能感知的问题,但现在我至少可以忍受与这个生成器一起工作。