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

大型解决方案中System.Memory程序集引用不一致致分析器加载失败求助

问题分析与解决:System.Memory版本冲突导致分析器加载失败

问题场景

  • 大型解决方案包含SDK项目(含API库和分析器库),构建后引用System.Memory, Version=4.0.2.0
  • 分析器运行时抛出以下警告:

    CSC : warning AD0001: Analyzer 'ApplicableOnConstraintAnalyzer' threw an exception of type 'System.IO.FileNotFoundException' with message 'Could not load file or assembly 'System.Memory, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51' or one of its dependencies. The system cannot find the file specified'.

  • 单独创建仅包含这些SDK项目的空白解决方案(构建属性、中央包管理与主方案一致)时,引用的System.Memory版本不同,可正常加载
  • 直接为SDK项目引用任意版本的System.Memory包无法解决问题,仅受主解决方案中其他项目的影响

核心原因

  • 解决方案级版本决议冲突:主解决方案中其他项目可能通过NuGet引用、全局配置文件(如Directory.Build.props)或中央包管理(CPM)的版本规则,强制将System.Memory的版本锁定为4.0.2.0,而空白解决方案没有这些额外约束,使用的是SDK项目自身依赖的兼容版本。
  • 分析器加载上下文限制:Roslyn分析器运行在独立的加载上下文里,不会自动应用项目级的绑定重定向,也不会默认回退到兼容版本。主解决方案的全局版本强制导致分析器尝试加载4.0.2.0,但该版本未被复制到分析器的加载路径,或被其他项目的依赖覆盖。
  • 中央包管理的版本覆盖:如果主方案启用了CPM,其他项目对System.Memory的版本要求可能优先级更高,覆盖了SDK项目的依赖版本,最终决议为4.0.2.0;而空白方案没有冲突的版本要求,决议为SDK兼容的版本。

解决办法

1. 统一解决方案内的System.Memory版本

在解决方案根目录的Directory.Build.props中添加全局版本约束,确保所有项目使用同一兼容版本(推荐4.5.4,这是稳定兼容的版本):

<Project>
  <PropertyGroup>
    <ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
  </PropertyGroup>
  <ItemGroup>
    <PackageVersion Include="System.Memory" Version="4.5.4" />
  </ItemGroup>
</Project>

清理所有项目的obj和bin目录,重新构建,确保版本统一生效。

2. 为分析器项目显式配置依赖并复制到输出

在分析器库项目的.csproj中,显式引用兼容版本的System.Memory,并设置PrivateAssets="none"确保程序集被复制到分析器输出路径:

<ItemGroup>
  <PackageReference Include="System.Memory" Version="4.5.4" PrivateAssets="none" />
</ItemGroup>

同时添加目标节点,确保程序集被复制到分析器可加载的路径:

<Target Name="CopySystemMemoryToAnalyzerOutput" AfterTargets="Build">
  <Copy SourceFiles="$(NuGetPackageRoot)\system.memory\4.5.4\lib\netstandard2.0\System.Memory.dll" DestinationFolder="$(OutputPath)" />
</Target>

3. 调整或移除强制绑定重定向

检查主解决方案中是否有项目通过app.config或AssemblyBinding配置强制绑定System.Memory到4.0.2.0,若该配置非必需,修改为兼容版本或直接移除:

<dependentAssembly>
  <assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
  <bindingRedirect oldVersion="0.0.0.0-4.5.4.0" newVersion="4.5.4.0" />
</dependentAssembly>

4. 确保分析器目标框架与依赖兼容

检查分析器项目的目标框架,比如若目标是.NET Standard 2.0,则使用System.Memory 4.5.4及以上版本,避免使用老旧的4.0.2.0版本,减少版本兼容问题。

内容的提问来源于stack exchange,提问作者ZorgoZ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 07:06:00