101

log4net バージョン 1.2.10.0 に依存するいくつかのフレームワークを使用する asp.net 4.0 プロジェクトがあります。今日、log4net バージョン 1.2.11.0 に依存する新しいフレームワークを含めようとしましたが、それ以来行き詰まっています。

log4net 1.2.10.0 には publickeytoken = 1b44e1d426115821 があります

log4net 1.2.11.0 には publickeytoken = 669e0ddf0bb1aa2a があります

これらは異なるため、web.config のランタイム要素を介して、アセンブリ リダイレクト (すべてのフレームワークで同じバージョンの log4net を使用するため) またはコードベース (新しいフレームワークだけでバージョン 1.2.11.0 を使用するため) を使用することはできません。

ここでのオプションは何ですか?

(そして、バージョン 1.2.9.0 と 1.2.10.0 の間の切り替えの理由がキーの紛失であったことを理解しているため、log4net がバージョン間で publickeytokens を変更し続けるのはなぜですか。必要に応じて安全に保管するため...)

編集: わかりまし、log4net の連中は 2 つのキーでリリースするのが良い考えだったようです。同じアプリドメインに並んでいます。これが恐ろしい考えだと思うのは私だけですか?みんなでやったら全部壊れちゃうよね?

Edit2: 私が述べたように、私は自分のビジネス コードで log4net を使用していませんが、1.2.10.0 に依存するいくつかのフレームワークを使用しており、1.2.11.0 に依存する新しいフレームワークを使用しようとしたときに問題が発生しました (新しいキー)、新しいフレームワークは古いキーではなく新しいキーを期待するため、Stefans の回答は適用されません。

4

6 に答える 6

65

これが、バージョン 1.2.11.0 で動作するようになった方法です。

  1. そもそもキーを変更するための呪いのApache :)
  2. 古い鍵で署名された 1.2.11.0 のバージョンをダウンロードします。
  3. log4net (新しいキー) への直接参照を削除して独自のコードを整理し、古いキーで署名されたアセンブリへの参照に置き換えます。
  4. このセグメントを web/app.config に含めて、依存する可能性のあるアセンブリを整理します
   <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <dependentAssembly>
                <assemblyIdentity name="log4net" publicKeyToken="1b44e1d426115821" culture="neutral" />
                <bindingRedirect oldVersion="0.0.0.0-1.2.10.0"
                                 newVersion="1.2.11.0"/>
            </dependentAssembly>
        </assemblyBinding>
    </runtime>
于 2012-01-10T16:22:41.953 に答える
28

nuget からダウンロードした最新バージョンの log4net を使用しています。ただし、使用しているライブラリの 1 つは古いバージョンを必要とします。私の悩みが私をこの質問に導きました。

他の回答の問題は、すべてのバインディングに同じ dll バージョンを使用していることです。新しいバージョンの機能を、従来の依存関係以外のすべてに使用したいと考えています。

これを行うには、次のことを行う必要があります。

  1. 古いバージョン (バージョン 1.2.11.0)をダウンロードすることから始めます。
  2. ダウンロードしたバイナリの名前をlog4net.1.2.10.dll. ビルドアクションNoneを「新しい場合はコピー」 に設定して、スタートアッププロジェクトに含めますここに画像の説明を入力
  3. 古いバージョンを見つけることができる場所を .NET に伝えます。

App.config

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
            <assemblyIdentity name="log4net" publicKeyToken="1b44e1d426115821" />
            <codeBase version="1.2.10.0" href="log4net.1.2.10.dll" />
        </dependentAssembly>
    </assemblyBinding>
</runtime>

href属性は、古いバージョンがどこにあるかを識別します。したがって、log4net に対する他のすべての要求は、新しいバージョンを指します。

于 2014-11-13T13:13:22.540 に答える
3

古い鍵で署名されたバージョンの log4net 1.2.11.0 をダウンロードできます。が新しいキーに変更された理由は、FAQ で説明されています。

http://logging.apache.org/log4net/release/faq.html#two-snks

(基本的に、新しいキーは公開されており、何らかの理由で古いキーをディストリビューションに含めたくなかったのですが、古いキーを公開しなかった理由は明らかではありません)

于 2012-01-06T09:15:24.027 に答える
1

特定のケースに適しているかどうかはわかりませんが、フレームワークの1つを再コンパイルできるため、同じ公開鍵でlog4netを使用できます。私の場合、log4net 1.2.10 を使用する FluentNHibernate と、新しいキーを持つ log4net 1.2.11 を使用する Combres でした。古いキーで署名されたlog4net 1.2.11をダウンロードし、Combressを再コンパイルしました。その後、1.2.10 から 1.2.11 へのアセンブリ バインディング リダイレクトを追加すると、機能し始めます。

于 2012-05-14T21:24:15.043 に答える
0

これは必ずしもすべての場合に機能するとは限りませんが、log4netを使用していたプロジェクトはOSSであったため、ソースをダウンロードし、競合するバージョンのlog4netを使用していたバージョンに置き換えて、プロジェクトを再構築しました。私の場合はTopshelfだったので、使用しているのと同じバージョンのlog4netでビルドされたバージョンのTopshelfアセンブリがあり、両方を問題なく参照できるようになりました。

于 2012-01-21T15:59:42.253 に答える
0

上記のリンクにアクセスしようとしましたが、Apache サイトのすべてのリンクが機能していないようです。次に、これは私が問題を解決するためにしたことです:

Visual Studio から Nuget を使用して、最新バージョンの log4net (1.2.13.0) をダウンロードしてインストールします。NuGet パッケージ マネージャーは、すべての log4net(1.2.11.0) を自動的にダウンロードして最新バージョンにアップグレードします。

于 2015-05-28T22:22:20.177 に答える