我有一个可以工作的源代码生成器类库,但是消费者项目只有在重新启动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}");
}
}
}
有什么建议吗?
1条答案
按热度按时间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的更改。