publickeytokenを変更しながらlog4netを回避するには


99

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を使用する)を使用できません。

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

(そして、なぜlog4netがバージョン間でpublickeytokensを変更し続けるのか、私はそれが失われたキーがバージョン1.2.9.0と1.2.10.0の間の切り替えの理由だったと理解しているので、彼らは再びキーを失いましたか?私は自分のドロップボックスをボランティアします必要に応じて安全に保管する...)

編集:[OK]を、log4netのみんなは明らかにその手段があること2つのキーで解除することは良いアイデアだったという考えを持っていましたが、ので、すべてのあなたがニーズを利用するフレームワークが同意している彼らが好む2種類の、またはそれらのフレームワークできない作業側同じappdomainに並んでいます。私がこれを恐ろしい考えだと思ったのは私だけですか?誰もがこれを行った場合、すべてが壊れますよね?

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


1
私見、ここのapacheからの最初のエラーは、新しいキーで署名されたバイナリを提供することです。新しいキーは、パッチが適用された、または拡張されたオープンソースバージョン用であり、そのままでは使用できません。2番目のエラーは、あなたが話しているフレームワークが新しいlog4net署名のみでリリースされたことです。古い署名のバージョンが存在するはずです。
JoeBilly、2012年

6
実際、あなたは3番目のフレーバーを見ています。SAPの天才は、Crystal Reports for Visual Studioパッケージの一部として独自の厳密な名前で再コンパイルしたもので、さらに悪いことに、GACにスタックして、マシン間の依存関係は悪夢です。
ジェレミー・ホロバックス2012

回答:


65

これは、バージョン1.2.11.0で機能する方法です。

  1. そもそもキーを変更するためのcurse 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>

9
古い公開鍵で署名されたバージョンをダウンロードする必要があります。残念ながら、別の公開鍵でアセンブリへのバインディングリダイレクトを実行することはできません。
David Christiansen

2
これは1.2.11.0での破壊変化により失敗するようだ: netpl.blogspot.com/2012/03/...
sydneyos

誰もが次の例外が発生し@sydneyos言及リンクで説明した問題の解決策を見つけた:Method not found: 'Void log4net.Config.BasicConfigurator.Configure()'
ネオ

残念ながら、1.2.10にダウングレードする以外に解決策はありません。(または、使用するすべての依存アセンブリを再コンパイルします)。
bk0 2013

1
1.2.10アセンブリを別のディレクトリに配置し、次の構成を使用します。 "newVersion =" 1.2.10.0 "/> <codeBase version =" 1.2.10.0 "href =" Resources \ log4net-oldkey \ log4net.dll "/> </ dependentAssembly> '
Agile Jedi

27

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に対する他のすべての要求は新しいバージョンをポイントします。


4
これは、どちらかを参照するライブラリの両方のバージョンを維持できるため、優れたソリューションです。
SouthShoreAK 2015

2
ありがとうございました!これは私を救った。「出力ディレクトリにコピー」を「コピーしない」に変更する必要がありましたが、それ以外の点では魅力的でした。
DanielHedenström18年

3

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

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

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


10
しかし、新しいキーに関連付けられているサードパーティのライブラリを使用すると、まだスタックしています(右?)。新しいlog4netを使用するのは私の選択ではなくサードパーティのフレームワークです。私はこのようなものは、新しいキーで使用log4netのに、より多くのフレームワークを開始するようeveryonesの顔に爆破するつもりはない方法を見ることができない
AndreasKnudsen

残念ながらそれは正しいです。すべてのコンポーネントで同じバージョンのlog4netを使用しないことを検討する必要があると思います...
Stefan Egli

1
....そして、どうすればそれを実現できますか?この問題を処理するための.netのメカニズムはありますか?
AndreasKnudsen 2012年


1

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


0

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


0

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.