Intellisense 没有看到本地 C# 源生成器生成的源

问题描述 投票:0回答:1

我有一个包含 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);
        }
    }

这里是完整的源代码,如果您想查看的话。

c# roslyn roslyn-code-analysis sourcegenerators
1个回答
0
投票

事实证明,将源生成器更改为增量生成器解决了该问题,至少对于 VS Code 而言是如此。一旦我可以验证这将继续有效,我就会接受这个答案。

如果阅读本文的任何人都遇到与我相同的问题,那么这篇文章对于将源生成器转换为增量生成器可能很有用。

© www.soinside.com 2019 - 2024. All rights reserved.