web-dev-qa-db-fra.com

Impossible de charger les assemblys pour la bibliothèque .Net Standard (System.Text.Json)

J'écris une bibliothèque .Net Standard 2.0 qui sera utilisée par un module PowerShell binaire. La bibliothèque sera essentiellement un client API avec de nombreuses classes pour traiter les réponses JSON. Avant d'essayer de désérialiser les chaînes, j'ai confirmé que l'API fournissait la chaîne codée JSON sans problème.

Comme c'était compatible avec .Net Standard 2.0 lors de l'utilisation du package NuGet, j'ai pensé que j'essaierais de passer à System.Text.Json, plutôt que d'utiliser NewtonSoft. Cependant, il ne semble pas avoir la version d'assemblages particuliers dont il a besoin sur certaines plates-formes.

Mon environnement:

Windows 10
Bureau PowerShell 5.1
. Net Framework 4.8
PowerShell Core 6.2.2
dotnet version 3.0.100

Sur PowerShell Desktop , j'obtiens les problèmes suivants lorsqu'il doit désérialiser quoi que ce soit:

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

Sur PowerShell Core il y a la même exception pour un autre Assembly/file.

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

Quelqu'un a-t-il eu des conseils sur la façon de résoudre ce problème sans passer au package JSON de Newtonsoft? Le retour de System.Text.Json 4.7.1 à 4.7.0 ou 4.6.0 introduit des problèmes avec d'autres assemblys qui font partie du package NuGet pour System.Text.Json. J'ai lu les conseils ici , mais soit je ne peux pas l'appliquer ici, soit je ne comprends tout simplement pas.

Merci d'avance. Veuillez me faire savoir si vous avez besoin de plus d'informations, je vous les fournirai.

[~ # ~] modifier [~ # ~]

J'ai mis à jour le csproj comme suggéré par Gokhan

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

Cela a généré le code suivant dans le fichier 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>

Ainsi, la génération automatique de toutes les redirections de liaison ne fonctionne pas, comme mentionné ci-dessus, il y en a au moins deux autres qui ne fonctionnent pas. J'essaierais de les créer manuellement, mais pour autant que je sache, il n'y a pas de fichier de configuration source pour les mettre maintenant. Si quelqu'un a des directives à ce sujet, je l'apprécierais.

8
Ash

Ouvrez votre solution dans Visual studio Vérifiez votre référence pour toutes les dll. Avez-vous une DLL en double de Bin et une autre du package nugget? Si vous disposez de Visual Studio 2017 version 15.7 ou ultérieure, vous pouvez facilement désactiver les redirections de liaison générées automatiquement dans les pages de propriétés du projet.

Cliquez avec le bouton droit sur le projet dans l'Explorateur de solutions et sélectionnez Propriétés.

Sur la page Application, décochez l'option Générer automatiquement les redirections de liaison.

Appuyez sur Ctrl + S pour enregistrer la modification. Essayez de le construire. Vérifiez que vous référencez toutes les DLL à partir de l'emplacement du nugget et que rien ne provient du dossier bin. S'il est construit, vous êtes prêt à partir, sinon, refaites la compilation de la redirection de liaison.

0
Jin Thakur