如何修复.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
相关产品推荐
相关产品推荐

