You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复.NET 6环境下源代码生成器运行报错的问题

问题根因

源代码生成器运行在Roslyn编译器的独立加载上下文中,和项目本身的运行环境、生成器项目的输出目录完全隔离,编译器只会加载标记为Analyzer的程序集,你之前的CopyLocal配置完全不会被编译器识别,所以无效。升级生成器到.NET 6后出现的报错,是因为编译器的运行时环境和.NET 6目标框架的基础库版本不匹配导致的。

解决步骤
  • 第一步:将生成器项目的目标框架回退到.NET Standard 2.0,这是目前源代码生成器兼容性最好的目标框架,无需升级到.NET 6。
  • 第二步:移除生成器项目中之前添加的<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>配置,该配置对编译器加载生成器没有任何作用。
  • 第三步:修改生成器项目中System.Collections.Immutable包的引用配置,添加PrivateAssets="all"和GeneratePathProperty="true"属性:
<PackageReference Include="System.Collections.Immutable" Version="6.0.0" PrivateAssets="all" GeneratePathProperty="true" />
  • 第四步:在生成器项目中添加配置,将依赖的System.Collections.Immutable.dll作为分析器依赖随生成器一起提供给编译器,有两种可选方案:
    • 方案A:将依赖嵌入生成器程序集,无需修改引用生成器的项目配置,适合生成器需要打包为NuGet包的场景:
    <ItemGroup>
      <EmbeddedResource Include="$(PkgSystem_Collections_Immutable)\lib\netstandard2.0\System.Collections.Immutable.dll" LogicalName="%(Filename)%(Extension)" />
    </ItemGroup>
    
    • 方案B:在引用生成器的主项目中,将依赖的dll明确标记为分析器文件,适合生成器和主项目在同一个解决方案的场景:
    <!-- 原有生成器引用保持不变 -->
    <ProjectReference Include="..\你的生成器项目路径\你的生成器项目.csproj" OutputItemType="Analyzer" ReferenceOutputAssembly="false" />
    <!-- 新增依赖引用 -->
    <None Include="$(PkgSystem_Collections_Immutable)\lib\netstandard2.0\System.Collections.Immutable.dll" Visible="false">
      <IsAnalyzer>true</IsAnalyzer>
    </None>
    

配置完成后清空项目的obj和bin目录,重新编译即可解决报错。

内容的提问来源于stack exchange,提问作者Ramon de Klein

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 12:06:04