c# - VS 和 Rider 忽略源生成器生成的文件

标签 c# sourcegenerators csharp-source-generator

C# 源生成的文件被忽略或显示错误,但当我将文件复制出来时,一切正常。

状态.Text.g.cs

using System.Collections.Generic;
using System.Linq;

#nullable enable
namespace GeneratorUnitTestProject.StateMachineTests
{
//[...]
}

它表示错误是预期的 CS1001 标识符。

如果我复制生成的文件并删除生成器,它就可以正常工作并且我的单元测试会成功。

这是我的单元测试解决方案的 csproj

<Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
        <TargetFramework>net7.0</TargetFramework>
        <ImplicitUsings>enable</ImplicitUsings>
        <Nullable>enable</Nullable>
    
        <IsPackable>false</IsPackable>
        <IsTestProject>true</IsTestProject>
    </PropertyGroup>

    <ItemGroup>
        <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.5.0" />
        <PackageReference Include="NUnit" Version="3.13.3" />
        <PackageReference Include="NUnit3TestAdapter" Version="4.4.2" />
        <PackageReference Include="NUnit.Analyzers" Version="3.6.1" />
        <PackageReference Include="coverlet.collector" Version="3.2.0" />
        <ProjectReference Include="..\TaskReward.Expander\TaskReward.Expander.csproj" OutputItemType="Analyzer" ReferenceOutputAssembly="false" />
    </ItemGroup>

    <ItemGroup>
      <AdditionalFiles Include="StateMachineTests\Text.xstate" />
    </ItemGroup>

</Project>

这是我的生成器的 csproj

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
    <LangVersion>Latest</LangVersion>
    <Nullable>enable</Nullable>
    <EnforceExtendedAnalyzerRules>true</EnforceExtendedAnalyzerRules>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.4" PrivateAssets="all" />
    <PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.6.0" PrivateAssets="all" />
  </ItemGroup>

  <ItemGroup>
    <!-- Generator dependencies -->
    <PackageReference Include="Newtonsoft.Json" Version="12.0.2" PrivateAssets="all" GeneratePathProperty="True" />
  </ItemGroup>

  <PropertyGroup>
    <GetTargetPathDependsOn>$(GetTargetPathDependsOn);GetDependencyTargetPaths</GetTargetPathDependsOn>
  </PropertyGroup>

  <Target Name="GetDependencyTargetPaths">
    <ItemGroup>
      <TargetPathWithTargetPlatformMoniker Include="$(PKGNewtonsoft_Json)\lib\netstandard2.0\Newtonsoft.Json.dll" IncludeRuntimeDependency="false" />
      <!-- Pack both our DLL and the dependencies into a generated Nuget Package -->
      <None Include="$(OutputPath)\$(AssemblyName).dll" Pack="true" PackagePath="analyzers/dotnet/cs" Visible="false" />
      <None Include="$(PKGNewtonsoft_Json)\lib\netstandard2.0\Newtonsoft.Json.dll" Pack="true" PackagePath="analyzers/dotnet/cs" Visible="false" />
    </ItemGroup>
  </Target>

</Project>

如果我继续添加“gen”。在命名空间前面,错误更改为未找到命名空间。 (CS0246) 但 IDE(Rider 或 VS)的 UI 中没有显示任何错误。就像它被忽略一样,但错误日志没有说明任何内容。

Fehler beim Buildvorgang.

       "...\GeneratorUnitTestProject\GeneratorUnitTestProject.csproj" (build Ziel) (1) ->
       (CoreCompile Ziel) -> 
         ...\GeneratorUnitTestProject\...\....Gen.State.Statemachines\state.Text.g.cs(172,106): warning CS8669: Die Anmerkung für Nullable-Verweistypen darf nur in Code innerhalb eines #nullable-Anmerkungskontexts verwendet werden. Für automatisch generierten Code ist eine explizite #nullable-Anweisung in der Quelle erforderlich.


       "...\GeneratorUnitTestProject\GeneratorUnitTestProject.csproj" (build Ziel) (1) ->
       (CoreCompile Ziel) -> 
         ...\GeneratorUnitTestProject\StateMachineTests\MachineTest.cs(1,7): error CS0246: Der Typ- oder Namespacename "gen" wurde nicht gefunden (möglicherweise fehlt eine using-Direktive oder ein Assemblyverweis).

    1 Warnung(en)
    1 Fehler

最佳答案

每次 Microsoft 更新其 C# 分析器库时,这个问题都会反复出现。

将分析器包降级到 4.5.0,直到 IDE catch 。

<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.5.0" PrivateAssets="all" />

作为补充说明,每次更新 Microsoft.CodeAnalysis.CSharp 时,您可能还需要更新您的 dotnet SDK。例如,4.5.07.0.201 上运行良好,但升级到 4.6.0 需要 SDK 版本 7.0.302,否则构建看起来根本没有运行源生成器。

关于c# - VS 和 Rider 忽略源生成器生成的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76298092/

相关文章:

visual-studio - 如何在 VS 2022 中调试 Roslyn 源代码生成器?

c# - 罗斯林分析器 : Is class marked as partial

.net - 编译器管道如何对应增量源生成?

c# - 如何确定是否正在使用 Microsoft.VisualStudio.Web.CodeGeneration.Design?

c# - 如何使用包含的源代码生成器发布 .Net 库?

c# - 使用带有 "new {..}"LINQ 查询的 CopyToDataTable 的异常

需要 C# 线程帮助

c# - 使用 LINQ 聚合对象

c# - 用于在 C# 中创建 MIDI 曲调的 API/库?

C# 字符串的类型?是 TypeKind.Class