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

VS2017 VSIX开发中System.Text.Json依赖CompilerServices.Unsafe版本冲突问题

问题场景与冲突现象

开发VS2017的VSIX扩展时,使用System.Text.Json 6.0.0.0进行序列化/反序列化,遇到System.Runtime.CompilerServices.Unsafe组件的版本冲突问题:

  • 配置Unsafe为**4.0.4.1(NuGet版本4.5.3)**并设置绑定重定向后,程序报错要求6.0.0.0版本的组件(经ILSpy确认打包版本为4.0.4.1)
  • 升级Unsafe至**6.0.0.0(NuGet版本6.0.0)**并配置对应重定向后,程序又报错要求4.0.4.1版本

已配置详情

4.0.4.1版本配置

  • app.config绑定重定向:
<dependentAssembly>
        <assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.0.4.1" newVersion="4.0.4.1" />
</dependentAssembly>
  • csproj引用配置:
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=4.0.4.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.4.5.3\lib\net461\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
</Reference>
  • packages.config设置:
<package id="System.Runtime.CompilerServices.Unsafe" version="4.5.3" targetFramework="net472" />

6.0.0.0版本配置

  • app.config绑定重定向:
<dependentAssembly>
        <assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
      </dependentAssembly>
  • csproj引用配置:
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
          <HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
</Reference>
  • packages.config设置:
<package id="System.Runtime.CompilerServices.Unsafe" version="6.0.0" targetFramework="net472" />

已尝试的无效操作

  • 清除本地NuGet包缓存
  • 删除bin/obj文件夹后重新编译
  • 升级/降级System.Text.Json版本
解决建议

1. 切换至PackageReference管理NuGet包

packages.config在VSIX扩展中对绑定重定向的支持有限,换成PackageReference后NuGet会自动处理依赖和重定向逻辑:

  1. 右键项目 → 管理NuGet包 → 点击右上角设置图标
  2. 在「包管理」→「默认包管理格式」中选择「PackageReference」
  3. 卸载当前的System.Runtime.CompilerServices.Unsafe和System.Text.Json,重新安装对应版本

2. 强制私有部署Unsafe组件

确保组件随VSIX一起部署,避免依赖VS宿主环境的版本:

  • 修改csproj中的引用配置,添加<Private>True</Private>和<PrivateAssets>All</PrivateAssets>:
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
  <HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
  <Private>True</Private>
  <PrivateAssets>All</PrivateAssets>
</Reference>
  • 打开source.extension.vsixmanifest,在「资产」选项卡中确认已包含该组件(可选择「添加」→「项目输出」,确保选中对应的dll)

3. 手动强制绑定重定向生效

在csproj中添加以下配置,确保自动生成正确的绑定重定向:

<PropertyGroup>
  <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
  <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
</PropertyGroup>

同时在app.config中覆盖所有版本范围的重定向(以6.0.0.0为例):

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  <dependentAssembly>
    <assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
  </dependentAssembly>
</assemblyBinding>

4. 检查VS宿主环境的干扰

VS2017自身可能加载了特定版本的System.Runtime.CompilerServices.Unsafe,可以尝试在调试时启用融合日志查看器(Fusion Log Viewer),确认是哪个程序集触发了版本请求,针对性调整重定向规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 03:17:09