使用System.CodeDom的SourceGenerator运行时报FileNotFoundException原因求解
错误产生的核心原因
该错误是由Roslyn源码生成器的依赖加载机制导致的,具体原因如下:
- Roslyn源码生成器运行在编译器进程的独立加载上下文中,默认只会加载生成器项目直接输出的程序集,不会自动加载引用的NuGet包对应的第三方依赖dll。你引入的
System.CodeDom 5.0.0属于独立NuGet包,不会被自动加入编译器的依赖搜索路径,因此生成器运行时无法找到该程序集。 - 你当前的项目配置没有将
System.CodeDom和生成器本体一起打包,编译器加载生成器时仅识别你的生成器项目输出的dll,缺失对应的依赖文件。
修复方案
你只需修改生成器项目的配置,将System.CodeDom作为生成器的附加依赖打包即可,修改参考如下:
<ItemGroup> <!-- 给包引用添加必要属性 --> <PackageReference Include="Microsoft.CodeAnalysis" Version="3.8.0" PrivateAssets="all" /> <PackageReference Include="System.CodeDom" Version="5.0.0" PrivateAssets="all" GeneratePathProperty="true" /> </ItemGroup> <!-- 将System.CodeDom.dll打包到生成器的分析器目录 --> <ItemGroup> <None Include="$(PkgSystem_CodeDom)\lib\netstandard2.0\System.CodeDom.dll" Pack="true" PackagePath="analyzers/dotnet/cs" Visible="false" /> </ItemGroup>
如果你有其他项目引用的第三方依赖,也按照相同逻辑将对应dll打包到analyzers/dotnet/cs路径即可。
内容的提问来源于stack exchange,提问作者Christian Sauer
相关产品推荐
相关产品推荐

