英文:
System.Text.Json requires two different versions of CompilerServices.Unsafe?
问题
不要回答我要翻译的问题。以下是已经翻译好的部分:
用于上下文,我正在为VS2017创建一个VSIX,我需要System.Text.JSON来进行数据的序列化/反序列化。我正在使用System.Text.JSON的版本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),我会遇到以下错误:
是的,现在它需要版本4.0.4.1!
详细信息
app.config、.csproj和packages.config
...使用版本4.0.4.1
当我尝试使用版本4.0.4.1的CompilerServices.Unsafe时,我会像这样设置我的项目:
- 我在app.config中设置了绑定重定向到版本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中添加了对版本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
同样,当我将其设置为6.0.0.0时,我执行相同的步骤
- 我在app.config中设置了绑定重定向到版本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降级。结果:没有变化。
英文:
For context, I am making a VSIX for VS2017, and I require System.Text.JSON for serializing/deserializing data.I am using version 6.0.0.0 of System.Text.JSON
If I set CompilerServices.Unsafe to 4.0.4.1 (nuget version 4.5.3) (with appropriate binding redirects (see below)), I get this error:
As you can see, it asks for System.Runtime.CompilerServices.Unsafe version 6.0.0.0. Using ILSpy within the target directory, I can see that the version of System.Runtime.CompilerServices.Unsafe that came bundled was version 4.0.4.1, as expected.
In response, I bump System.Runtime.CompilerServices.Unsafe to 6.0.0.0 (nuget version 6.0.0), I get this error!
That's right - now it wants version 4.0.4.1!
Details
app.config, .csproj, packages.config
...with version 4.0.4.1
When I try with version 4.0.4.1 of CompilerServices.Unsafe, I setup my project like so:
- I setup app.config with a binding redirect to version 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>
- I add a reference to version 4.0.4.1 on the 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>
- I set it to 4.5.3 in packages.config.
<package id="System.Runtime.CompilerServices.Unsafe" version="4.5.3" targetFramework="net472" />
...with version 6.0.0.0
Similarly, when I set it to 6.0.0.0, I perform the same steps
- I setup app.config with a binding redirect to version 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>
- I setup the 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>
- I setup packages.config
<package id="System.Runtime.CompilerServices.Unsafe" version="6.0.0" targetFramework="net472" />
Fix Attempts
A few things I have tried:
-
clear the local package cache (ie, deleting the folder called "packages" at solution root). Result: No Change.
-
remove bin and obj folders. Result: No Change.
-
upgrading system.text.json to version 6.0.7 (Highest version of major version 6.0.0) . Result: No Change.
-
upgrading system.text.json to version 7.0.2 (Latest). Result: No change.
-
downgrading system.text.json. Result: No change.
答案1
得分: 1
Alright, "I" figured it out (credit to @zivkan for pointing me in the right direction 😊). Instead of using app.config style of binding redirects (which doesn't work for VSIX) you can instead use ProvideBindingRedirectionAttribute.
I this line to my AssemblyInfo.cs:
```csharp
[assembly: ProvideBindingRedirection(AssemblyName = "System.Runtime.CompilerServices.Unsafe",
NewVersion = "6.0.0.0", OldVersionLowerBound = "1.0.0.0",
OldVersionUpperBound = "4.0.4.2")]
...and, as if by magic, it just works.
See also:
- https://stackoverflow.com/a/40118966/10448804 : SO answer that led me in the right direction
- https://learn.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2013/hh265700(v=vs.120) : More details
<details>
<summary>英文:</summary>
Alright, "I" figured it out (credit to @zivkan for pointing me in the right direction 😊). Instead of using app.config style of binding redirects (which doesn't work for VSIX) you can instead use ProvideBindingRedirectionAttribute.
I this line to my AssemblyInfo.cs:
```csharp
[assembly: ProvideBindingRedirection(AssemblyName = "System.Runtime.CompilerServices.Unsafe",
NewVersion = "6.0.0.0", OldVersionLowerBound = "1.0.0.0",
OldVersionUpperBound = "4.0.4.2")]
...and, as if by magic, it just works.
See also:
- https://stackoverflow.com/a/40118966/10448804 : SO answer that led me in the right direction
- https://learn.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2013/hh265700(v=vs.120) : More details
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论