Visual Studio System.Text.Json需要两个不同版本的CompilerServices,不安全?

xxb16uws  于 2023-04-12  发布在  其他
关注(0)|答案(1)|浏览(189)

对于上下文,我正在为VS 2017制作VSIX,我需要System.Text.JSON来序列化/反序列化数据。我使用的是System.Text.JSON的www.example.com版本6.0.0.0
如果我将CompilerServices.Unsafe设置为4.0.4.1(nuget版本4.5.3)(使用适当的绑定重定向(见下文)),我会收到以下错误:

正如您所看到的,它要求System.Runtime.CompilerServices.Unsafe版本6.0.0.0。在目标目录中使用ILSpy,我可以看到捆绑的System.Runtime.CompilerServices.Unsafe版本是4.0.4.1,正如预期的那样。
作为响应,我将System.Runtime.CompilerServices.Unsafe转到6.0.0.0(nuget版本6.0.0),我得到了 this 错误!

没错-现在它需要版本4.0.4.1!

详情

app.config,.csproj,packages.config

...版本为4.0.4.1

当我尝试使用4.0.4.1CompilerServices.Unsafe的www.example.com版本时,我这样设置我的项目:

  • 我设置了app.config,并绑定重定向到www.example.com版本4.0.4.1
<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上添加了对www.example.com版本的引用4.0.4.1
<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中将其设置为4.5.3。
<package id="System.Runtime.CompilerServices.Unsafe" version="4.5.3" targetFramework="net472" />

...版本为6.0.0.0

同样,当我将其设置为www.example.com时6.0.0.0,我执行相同的步骤

  • 我设置了app.config,并绑定重定向到www.example.com版本4.0.4.1
<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" />

修复尝试

我尝试过的几件事:

  • 清除本地包缓存(即,删除解决方案根目录下名为“packages”的文件夹)。结果:无变化。
  • 删除bin和obj文件夹。结果:无变更。
  • 将system.text.json升级到版本6.0.7(主要版本6.0.0的最高版本)。结果:无变化。
  • 将system.text.json升级到版本7.0.2(最新)。结果:没有变化。
  • 降级system.text.json。结果:没有变化。
vxqlmq5t

vxqlmq5t1#

好吧,“我”弄明白了(感谢@zivkan为我指出了正确的方向😊)。你可以使用ProvideBindingRedirectionAttribute来代替使用app.config风格的绑定重定向(这在VSIX中不起作用)。
我在AssemblyInfo.cs中添加以下行:

[assembly: ProvideBindingRedirection(AssemblyName = "System.Runtime.CompilerServices.Unsafe",
      NewVersion = "6.0.0.0", OldVersionLowerBound = "1.0.0.0",
      OldVersionUpperBound = "4.0.4.2")]

......而且,就像变魔术一样,它就这么起作用了。
参见:

相关问题