引用CodeAnalysis.CSharp后netstandard2.0库运行时DLL缺失问题求助
问题根源
你遇到的运行时FileNotFoundException是因为类库项目中Microsoft.CodeAnalysis.CSharp包的PrivateAssets="all"配置导致的。该配置会将包的所有资产(包括运行时DLL)标记为私有,下游项目(如控制台程序)无法自动获取并复制这些依赖文件,因此运行时找不到对应的程序集。
解决方案
方案1:调整类库的PrivateAssets范围
将两个netstandard2.0类库中Microsoft.CodeAnalysis.CSharp的PrivateAssets从all改为analyzers;build,仅保留编译分析器和构建相关资产的私有性,允许运行时依赖传递到下游项目:
修改MyLib.csproj:
<ItemGroup> <PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.7.0" PrivateAssets="analyzers;build" /> </ItemGroup>
修改MySecondLib.csproj:
<ItemGroup> <ProjectReference Include="..\MyLib\MyLib.csproj" /> <PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.7.0" PrivateAssets="analyzers;build" /> </ItemGroup>
重新构建后,控制台项目会自动将该包的运行时DLL复制到输出目录,解决缺失问题。
方案2:控制台项目直接引用该包
如果不想修改类库的配置,可直接在net8.0控制台项目中添加Microsoft.CodeAnalysis.CSharp 4.7.0版本的引用,确保运行时DLL被复制:
修改NetStandardReproduction.csproj:
<ItemGroup> <ProjectReference Include="..\MySecondLib\MySecondLib.csproj" /> <PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.7.0" /> </ItemGroup>
方案3:强制复制所有锁定文件依赖
在控制台项目的属性组中添加<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>,强制将所有依赖的程序集复制到输出目录,适用于复杂依赖场景:
修改NetStandardReproduction.csproj:
<PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net8.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies> </PropertyGroup>
验证
完成上述任一修改后,重新构建整个解决方案并运行控制台程序,即可正常执行,不再抛出程序集缺失异常。
内容的提问来源于stack exchange,提问作者infinitezero

