必须重新启动 Visual Studio 才能选取源生成器文件

Must restart Visual Studio for source generator files to be picked up

提问人:aybe 提问时间:8/13/2023 更新时间:9/18/2023 访问量:215

问:

我有一个可以工作的源生成器类库,但使用者项目仅在重新启动 Visual Studio 后才获取最新生成的代码。

至少可以说,重新启动 Visual Studio 而不仅仅是重新生成解决方案是非常不方便的。

尝试卸载/重新加载项目/解决方案,但什么都没有。

试图清除 中的缓存,什么都没有。%LOCALAPPDATA%\Microsoft\VisualStudio\<version>\ComponentModelCache

截至今天,使用最新版本的 Visual Studio 2022。

实际的源生成器,最简单的一个:

using System;
using Microsoft.CodeAnalysis;

namespace ClassLibrary1
{
    [Generator]
    public class Class1 : ISourceGenerator
    {
        public void Initialize(GeneratorInitializationContext context)
        {
        }

        public void Execute(GeneratorExecutionContext context)
        {
            context.AddSource("test.g.cs", $"// {DateTime.Now:F}");
        }
    }
}

有什么建议吗?

C# Visual Studio 源生成器

评论

0赞 Hans Kesting 8/13/2023
请参阅文档中的第 8 点:不幸的是,这仍然是必需的
0赞 aybe 8/13/2023
是的,现在已经有几年了,情况还没有改善......
0赞 Illivion 9/13/2023
您可以卸载/加载生成器项目,而不是重新启动 VS
0赞 aybe 9/18/2023
不幸的是,它并不可靠。

答:

0赞 Nefanator 9/18/2023 #1

若要避免重新启动 Visual Studio,可以运行 .这将清除缓存。dotnet build-server shutdown

我已将其添加到我的源代码生成器项目的预构建步骤中,这似乎可以解决问题。

我在 Microsoft Learn Q&A 中找到了这个解决方案。这要归功于 Suchiman,他最初给出了这个答案:

“它的工作方式是,csc.exe,即C#编译器,通常会启动一个名为VBCSCompiler.exe的”编译服务器“(以避免一遍又一遍地启动进程的JIT开销)。在这种情况下,csc.exe只是获取参数并通过 IPC 将它们转发给VBCSCompiler.exe来完成工作。如果 VS 关闭,则该编译器进程将关闭,如果在 VS 外部使用它,则该编译器进程将具有空闲超时。源生成器是一个编译器插件,因此 VBCSCompiler 将加载该源生成器 dll 并执行它,但一旦加载,它就不会对 dll 进行更改”

评论

1赞 aybe 9/18/2023
不幸的是,它并不可靠。