Я пишу. Net Стандартную библиотеку 2.0, которая будет использоваться двоичным модулем PowerShell. Библиотека будет в основном клиентом API с большим количеством классов для обработки ответов JSON. Прежде чем пытаться десериализовать строки, я подтвердил, что API предоставлял кодированную строку JSON без проблем.
Поскольку она была совместима с. Net Стандарт 2.0 при использовании Пакет NuGet, я подумал, что попробую переключиться на System.Text. Json, а не на NewtonSoft. Однако, похоже, у него нет версии определенных сборок, которая требуется для определенных платформ.
Моя среда:
Windows 10
PowerShell 5.1 Desktop
. Net Framework 4.8
PowerShell Core 6.2.2
do tnet версия 3.0.100
При PowerShell Desktop возникают следующие проблемы, когда он должен десериализовать все, что угодно:
PS dir:\> Import-Module '.\file.dll'
PS dir:\> [namespace.class]::TestMethod($string, $anotherString) # Test method to return string
{"attribute":"value"}
PS dir:\> [namespace.class]::Method($string, $anotherString) # Same as above, but uses System.Text.Json to deserialise
Could not load file or assembly 'System.Buffers, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51' or one of its dependencies. The system
cannot find the file specified.
# System.Buffers.dll is with the System.Text.Json package, but seems to be the wrong version
PS dir:\> (Get-Item .\System.Buffers.dll).VersionInfo.FileVersion
4.6.26515.06
PS dir:\> [System.Reflection.Assembly]::LoadFile("$pwd\System.Buffers.dll").GetName().Version
Major Minor Build Revision
----- ----- ----- --------
4 0 3 0
На PowerShell Core там такое же исключение для другой сборки / файла.
PS dir:\> Import-Module '.\file.dll'
PS dir:\> [namespace.class]::Method($string, $anotherString)
"Could not load file or assembly 'System.Text.Encodings.Web, Version=4.0.5.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'. Could not find or load a specific file. (Exception from HRESULT: 0x80131621)"
#System.Text.Encodings.Web.dll is with the System.Text.Json package and appears to be the required version...
PS dir:\> (Get-Item .\System.Text.Encodings.Web.dll).VersionInfo.FileVersion
4.700.19.56404
[System.Reflection.Assembly]::LoadFile("$pwd\System.Text.Encodings.Web.dll").GetName().Version
Major Minor Build Revision
----- ----- ----- --------
4 0 5 0
Кто-нибудь получил какие-либо советы о том, как я можно решить эту проблему, не переходя на пакет Newtonsoft JSON? Откат от System.Text. Json 4.7.1 до 4.7.0 или 4.6.0 приводит к проблемам с другими сборками, которые являются частью пакета NuGet для System.Text. Json. Я прочитал совет здесь , но я либо не могу применить его здесь, либо я просто не понимаю.
Заранее спасибо. Пожалуйста, дайте мне знать, если вам потребуется дополнительная информация, я предоставлю ее.
РЕДАКТИРОВАТЬ
Я обновил csproj в соответствии с рекомендациями Гохана
<PropertyGroup>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
</PropertyGroup>
Это сгенерировало следующий код в appName.dll.config
<runtime>
<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-4.0.6.0" newVersion="4.0.6.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
Таким образом, автоматическая генерация всех перенаправлений привязки не работает, как упомянуто выше, есть как минимум еще две, которые не работают. Я бы попытался создать их вручную, но, насколько мне известно, сейчас нет исходного файла конфигурации, в который можно было бы их вставить. Если у кого-то есть какие-либо указания на это, я был бы признателен.