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会自动处理依赖和重定向逻辑:
- 右键项目 → 管理NuGet包 → 点击右上角设置图标
- 在「包管理」→「默认包管理格式」中选择「PackageReference」
- 卸载当前的
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
相关产品推荐
相关产品推荐

