web-dev-qa-db-ja.com

.Net標準ライブラリ(System.Text.Json)のアセンブリを読み込めません

バイナリPowerShellモジュールで使用される.Net Standard 2.0ライブラリを作成しています。ライブラリは基本的に、JSON応答を処理するための多くのクラスを持つAPIクライアントになります。文字列を逆シリアル化する前に、APIがJSONエンコードされた文字列を問題なく提供していたことを確認しました。

NuGetパッケージを使用する場合、.- Net Standard 2.0では compatible であるため、NewtonSoftを使用するのではなく、System.Text.Jsonに切り替えてみようと思いました。ただし、特定のプラットフォームで必要な特定のアセンブリのバージョンがないようです。

私の環境:

ウインドウズ10
PowerShell 5.1デスクトップ
。Net Framework 4.8
PowerShell Core 6.2.2
dotnetバージョン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にフォールバックすると、System.Text.JsonのNuGetパッケージの一部である他のアセンブリに問題が発生します。私はアドバイス here を読みましたが、ここでそれを適用できないか、単に理解していません。

前もって感謝します。さらに情報が必要な場合はお知らせください。提供いたします。

[〜#〜]編集[〜#〜]

Gokhanの提案に従って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>

したがって、前述のように、すべてのバインディングリダイレクトの自動生成は機能していません。機能しない機能が少なくとも2つあります。手動で作成してみますが、私の知る限りでは、これらを配置するためのソース構成ファイルはありません。誰かがそれに方向性を持っているなら、私はそれを感謝します。

8
Ash

Visual Studioでソリューションを開きます。すべてのDLLのリファレンスを確認してください。 BinからのDLLとナゲットパッケージからのDLLが重複していますか? Visual Studio 2017バージョン15.7以降を使用している場合は、プロジェクトのプロパティページで自動生成されたバインディングリダイレクトを簡単に無効にすることができます。

ソリューションエクスプローラーでプロジェクトを右クリックし、[プロパティ]を選択します。

[アプリケーション]ページで、[バインディングリダイレクトの自動生成]オプションをオフにします。

Ctrl + Sを押して変更を保存します。ビルドしてみてください。ナゲットの場所からすべてのDllを参照していて、binフォルダーからは何も参照していないことを確認します。ビルドされた場合は、それ以外の場合はバインドリダイレクトコンパイルを再度実行してください。

0
Jin Thakur