必须重新启动Visual Studio以拾取源生成器文件

k4ymrczo  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(101)

我有一个可以工作的源代码生成器类库,但是消费者项目只有在重新启动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}");
        }
    }
}

有什么建议吗?

6tqwzwtp

6tqwzwtp1#

若要保存您自己,避免重新启动Visual Studio,您可以运行dotnet build-server shutdown。这将清除该高速缓存。
我已经把它添加到我的源代码生成器项目的预构建步骤中,这似乎可以做到这一点。
我在Microsoft Learn Q&A中找到了这个解决方案。这要归功于Suchiman,他最初给出了这样的答案:
它的工作方式是,csc.exe,C#编译器,通常会启动一个名为VBCSloger.exe的“编译服务器”(以避免一遍又一遍地启动进程的JIT开销)。在这种情况下,csc.exe只是接受参数并通过IPC将它们转发到VBCSloger.exe来完成工作。如果VS关闭,编译器进程将关闭,如果它在VS之外使用,它有一个空闲超时。源代码生成器是一个编译器插件,因此VBCSloger将加载源代码生成器DLL并执行它,但一旦加载了DLL,它就不会拾取对DLL的更改。

相关问题