1

アセンブリ バインドの問題に関するいくつかの投稿を読み、提案された解決策の多くを試しましたが、すべてうまくいきませんでした。

私は比較的古い asp.net Web フォーム Web サイトを持っています。これは、NewtonSoft.Json に依存する .Net Framework 4.6 Analytics アセンブリに依存します。その Analytics アセンブリは私たち自身のものであり、NewtonSoft.Json v7.0.1 で構築されました。これは、Web サイトの bin フォルダーにあるアセンブリのバージョンです。

.Net Framework WebApi サービスに依存する新しい Web サイト、Angular SPA があります。サービスは、別のロギング サービスを呼び出すロギング ヘルパー コンポーネントに依存しています。ログ ヘルパー コンポーネントは Microsoft.AspNet.WebApi.Client に依存してサービス呼び出しを行います。これは、NewtonSoft.Json v6.0.4 に依存する System.Net.Http.Formatting に依存します。

Web サイトで新しいロギング ヘルパー コンポーネントを使用しようとすると、実行時にロギングが失敗し、NewtonSoft.Json の v6.0.0.0 またはその依存関係の 1 つを読み込めません。

v7.0 ファイルを Web サイトの bin フォルダーにドロップすると、Analytics アセンブリが NewtonSoft.Json の v7.0.0.0 またはその依存関係の 1 つを読み込めないため、Web サイトが失敗します。

理想的には、Microsoft.AspNet.WebApi.Client と System.Net.Http.Formatting を新しいバージョンの NewtonSoft.Json とうまく連携させたいと考えていますが、これらのアセンブリがどのように機能するかについてはあまり制御できません。Analytics コンポーネントを NewtonSoft.Json v6.0.4 で再構築しようとしましたが、ビルドしてデプロイすると、Web サーバーで何らかの形で v7.0.0.0 を探してしまいます。

岩と固いところの間に挟まっているような気がします。Analytics または Logging のいずれかを機能させることができますが、両方を機能させることはできません。a) ソリューションのためにどの方向を追求するかについての提案はありますか?Analytics コンポーネントが古いバージョンを受け入れるようにするか、Logging コンポーネントが新しいバージョンで動作するようにするか、b) これらのアプローチのいずれかを達成する方法はありますか?

更新 1 - 上記以外に試したことのいくつか: ロギング ヘルパー コンポーネントの .csproj プロジェクト ファイルで、NewtonSoft.Json 参照からバージョン情報を削除しようとしました。NewtonSoft.Json v7.0 ファイルを使用して Web サイトにデプロイしましたが、v6.0 を読み込めないと言って失敗しました。Assembly Binding Log Viewer fuslogvw.exe を使ってみました。正しく使用していなかったのかもしれませんが、アセンブリ バインディング エラーを再現でき、Assembly Binding Log Viewer には何も表示されませんでした。

更新 2 - ロギング ヘルパー コンポーネントにアセンブリ バインディング リダイレクトを追加して 6.0.0.0 から 7.0.0.0 にリダイレクトしようとしましたが、コンポーネントをビルドして Web サイトの bin フォルダーにドロップすると、NewtonSoft.Json 7.0 が追加されました。 v6.0.0.0 をロードできると言って、ロガーはまだ失敗します。ここから抜け出す方法はありませんか?

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  <dependentAssembly>
    <assemblyIdentity name="NewtonSoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral"/>
    <bindingRedirect oldVersion="6.0.0.0"
                     newVersion="7.0.0.0" />
  </dependentAssembly>
</assemblyBinding>

更新 3 - 以下は、ログ ヘルパー コンポーネントの packages.config です。packages.config のすべては、Microsoft.AspNet.WebApi.Client パッケージの追加に基づいていると思います。NuGet のパッケージ情報によると、NewtonSoft.Json >= 6.0.4 で動作するはずですが、常に 6.0.0.0 の検索に失敗します。

<packages>
    <package id="Microsoft.AspNet.WebApi.Client" version="5.2.6" targetFramework="net461" />
    <package id="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" version="1.0.5" targetFramework="net461" />
    <package id="Microsoft.Net.Compilers" version="2.4.0" targetFramework="net461" developmentDependency="true" />
    <package id="Newtonsoft.Json" version="6.0.4" targetFramework="net461" />
    <package id="System.Net.Http" version="2.0.20126.16343" targetFramework="net461" />
</packages>
4

1 に答える 1

0

私はこの答えに完全に満足しているわけではありませんが、うまくいくようです。このトピックに関するいくつかの投稿を読みました。具体的には、頻繁に競合しているように見える NewtonSoft.Json とのバージョン競合の問題に関する投稿です。この記事ではアセンブリ バインドのリダイレクトは、machine.config にある場合にのみ機能するという報告が何人かありました。ログ ヘルパー コンポーネントの構成ファイルにアセンブリ バインディング リダイレクトを追加しようとしていました。ランタイム バインディング エラーが発生したため、ランタイム アプリケーション、つまり Web サイトの構成に取り組む必要があることに気付きました。ただし、バインド リダイレクトを web.config に追加しても効果がないように見えますが、machine.config に追加すると機能します。残念ながら、別のバージョンを必要とするサーバー上の他のアプリケーションが機能しなくなります。だから... 答えのようなものですが、まだそこまでではありません. Web サーバーの machine.config に追加すると、Web サイトでログ ヘルパー コンポーネントが正しく機能するバインディング リダイレクトを次に示します。

<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  <dependentAssembly>
    <assemblyIdentity name="NewtonSoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral"/>
    <bindingRedirect oldVersion="6.0.0.0" newVersion="7.0.0.0" />
  </dependentAssembly>
</assemblyBinding>
</runtime>

しかし、サーバー上の他のアプリケーションを正しく動作させる方法を理解する必要があります。この問題は終わらないようです。

更新: 少なくとも私の開発環境とテスト環境では、実用的なソリューションがあります。この解決策には、上記のように machine.config でアセンブリ バインディング リダイレクトを行い、必要なバージョンのアセンブリをグローバル アセンブリ キャッシュ (GAC) にインストールして、サーバー上のすべてのアプリケーションで使用できるようにする必要があります。

それは私のお気に入りの解決策ではなく、代替案を聞いてうれしいですが、今のところ、これが私が持っているものであり、うまくいくようです. 残っている唯一の問題は、Visual Studio または Windows SDK がインストールされていない運用サーバー上の GAC にアセンブリを取得することです。したがって、gacutil.exe ユーティリティはありません。

于 2018-08-03T18:16:05.167 に答える