我有一个包含 4 个项目的解决方案。其中之一是 Roslyn 源生成器,一个是使用源生成器的类库,一个是也使用源生成器的测试项目,另一个是不使用源生成器的单元测试。该项目构建并完美运行,但我在 IDE 中收到生成代码的错误曲线。我尝试过 Visual Studio 和 VS Code(即使在完全不同的计算机上),但是在 VS Code 上,项目打开时有一个很小的时间窗口,我可以将鼠标悬停在生成的方法上并查看其签名。源生成器的目标是.NET Standard 2.0。我已经重新启动了我的编辑器,清理并重建了所有内容,在打开 IDE 之前清理并仅重建了源生成器,清除了所有缓存,然后重新启动了我的计算机。
这是 .csproj。其中一些是我从互联网上的某个项目复制过来的,试图让它工作,但没有帮助。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<EnforceExtendedAnalyzerRules>true</EnforceExtendedAnalyzerRules>
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
<IncludeBuildOutput>false</IncludeBuildOutput>
<LangVersion>12</LangVersion>
<IsRoslynComponent>true</IsRoslynComponent>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.9.2" PrivateAssets="all" />
<PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.4" PrivateAssets="all" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="SourceGeneratorsKit" Version="0.0.1" GeneratePathProperty="true" PrivateAssets="all" />
</ItemGroup>
<PropertyGroup>
<GetTargetPathDependsOn>$(GetTargetPathDependsOn);GetDependencyTargetPaths</GetTargetPathDependsOn>
</PropertyGroup>
<Target Name="GetDependencyTargetPaths">
<ItemGroup>
<TargetPathWithTargetPlatformMoniker Include="$(PKGSourceGeneratorsKit)\lib\netstandard2.0\SourceGeneratorsKit.dll" IncludeRuntimeDependency="false" />
</ItemGroup>
</Target>
</Project>
这就是没有我复制的其他内容时的样子。它也不能以这种形式工作。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<EnforceExtendedAnalyzerRules>true</EnforceExtendedAnalyzerRules>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.9.2" PrivateAssets="all" />
<PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.4" PrivateAssets="all" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="SourceGeneratorsKit" Version="0.0.1" GeneratePathProperty="true" PrivateAssets="all" />
</ItemGroup>
</Project>
这就是我在需要它的项目中引用源生成器的方式:
<ItemGroup>
<ProjectReference Include="..\Datapack.Net.SourceGenerator\Datapack.Net.SourceGenerator.csproj" OutputItemType="Analyzer" ReferenceOutputAssembly="false" />
</ItemGroup>
源生成器代码:
[Generator]
public class ProjectGenerator : ISourceGenerator
{
private readonly SyntaxReceiver Projects = new DerivedClassesReceiver("Project");
public void Execute(GeneratorExecutionContext context)
{
if (!(context.SyntaxContextReceiver is SyntaxReceiver)) return;
foreach (var i in Projects.Classes)
{
ProcessClass(context, i);
}
}
public void ProcessClass(GeneratorExecutionContext context, INamedTypeSymbol symbol)
{
// Unimportant
}
public void Initialize(GeneratorInitializationContext context)
{
context.RegisterForSyntaxNotifications(() => Projects);
}
}
这里是完整的源代码,如果您想查看的话。
事实证明,将源生成器更改为增量生成器解决了该问题,至少对于 VS Code 而言是如此。一旦我可以验证这将继续有效,我就会接受这个答案。
如果阅读本文的任何人都遇到与我相同的问题,那么这篇文章对于将源生成器转换为增量生成器可能很有用。