bagaimana cara mengatasi log4net dengan terus mengubah publickeytoken

99

Kami memiliki proyek asp.net 4.0 yang menggunakan beberapa kerangka kerja yang bergantung pada log4net versi 1.2.10.0. Hari ini saya mencoba memasukkan kerangka kerja baru yang bergantung pada log4net versi 1.2.11.0, saya macet sejak:

log4net 1.2.10.0 memiliki publickeytoken = 1b44e1d426115821

log4net 1.2.11.0 memiliki publickeytoken = 669e0ddf0bb1aa2a

Karena ini berbeda, saya tidak dapat menggunakan pengalihan perakitan (untuk membuat semua kerangka menggunakan versi yang sama dari log4net) atau basis kode (untuk menggunakan kerangka baru saja menggunakan versi 1.2.11.0) melalui elemen runtime di web.config.

Apa pilihan saya di sini?

(dan mengapa bleep tidak log4net terus mengubah token publik antar versi, seperti yang saya mengerti bahwa kunci yang hilang adalah alasan peralihan antara versi 1.2.9.0 dan 1.2.10.0, apakah mereka kehilangan kuncinya lagi? Saya akan menawarkan dropbox saya agar tetap aman jika mereka membutuhkannya ...)

Sunting: Ok, jadi orang-orang log4net tampaknya memiliki gagasan bahwa merilis dengan dua kunci adalah ide yang bagus, tetapi itu berarti bahwa setiap kerangka kerja yang Anda gunakan perlu menyetujui mana dari dua rasa yang mereka sukai, atau kerangka kerja itu tidak dapat bekerja secara bersamaan berdampingan di appdomain yang sama. Apakah saya satu-satunya yang menganggap ini sebagai ide yang mengerikan? jika semua orang melakukan ini maka semuanya akan rusak, kan?

Sunting2: Seperti yang saya nyatakan, saya tidak menggunakan log4net dalam kode bisnis saya, tetapi saya menggunakan beberapa kerangka kerja yang bergantung pada 1.2.10.0, dan masalah muncul ketika saya mencoba menggunakan kerangka kerja baru yang bergantung pada 1.2.11.0 (kunci baru ), jadi jawaban Stefans tidak berlaku, karena framework baru akan mengharapkan kunci baru, bukan yang lama

AndreasKnudsen
sumber
1
IMHO, kesalahan pertama dari apache di sini adalah memberikan binari yang ditandatangani dengan kunci baru: kunci baru dimaksudkan untuk versi open source yang ditambal / ditingkatkan dan tidak boleh digunakan sebagaimana mestinya. Kesalahan kedua adalah bahwa kerangka kerja yang Anda bicarakan telah dirilis dengan hanya tanda tangan log4net yang baru: versi dengan tanda tangan lama seharusnya ada.
JoeBilly
6
Sebenarnya, Anda sedang melihat rasa ketiga: yang jenius di SAP dikompilasi ulang dengan nama kuat mereka sendiri, sebagai bagian dari paket Crystal Reports untuk Visual Studio, dan untuk memperburuk keadaan, mereka menempelkannya di GAC yang akan membuat ketergantungan Anda di seluruh mesin adalah mimpi buruk.
Jeremy Holovacs

Jawaban:

65

Beginilah cara saya membuat semuanya berfungsi dengan versi 1.2.11.0.

  1. Kutukan apache karena mengubah kunci di tempat pertama :)
  2. Unduh versi 1.2.11.0 yang ditandatangani dengan kunci lama.
  3. Sortir kode Anda sendiri dengan menghapus semua referensi langsung ke log4net (kunci baru) dan ganti dengan referensi ke rakitan yang ditandatangani dengan kunci lama.
  4. Pilah rakitan dependen apa pun yang mungkin Anda miliki dengan memasukkan segmen ini di web / app.config Anda
   <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>
David Christiansen
sumber
9
Mengunduh versi yang ditandatangani dengan kunci publik lama diperlukan karena sayangnya tidak mungkin untuk melakukan pengalihan mengikat ke rakitan dengan kunci publik yang berbeda.
David Christiansen
2
Tampaknya ini gagal karena perubahan yang melanggar di 1.2.11.0: netpl.blogspot.com/2012/03/…
sydneyos
Adakah yang menemukan solusi untuk masalah yang dijelaskan di tautan yang disebutkan oleh @sydneyos yang menyebabkan pengecualian berikut:Method not found: 'Void log4net.Config.BasicConfigurator.Configure()'
Neo
Sayangnya, tidak ada solusi selain menurunkan ke 1.2.10. (atau kompilasi ulang setiap perakitan dependen yang Anda gunakan).
bk0
1
Letakkan rakitan 1.2.10 di direktori berbeda dan gunakan konfigurasi ini: '<dependentAssembly> <assemblyIdentity name = "log4net" publicKeyToken = "1b44e1d426115821" culture = "neutral" /> <bindingRedirect oldVersion = "0.0.0.0-1.2.9.0 "newVersion =" 1.2.10.0 "/> <codeBase version =" 1.2.10.0 "href =" Resources \ log4net-oldkey \ log4net.dll "/> </dependentAssembly> '
Agile Jedi
27

Saya menggunakan log4net versi terbaru yang saya unduh melalui nuget. Namun, salah satu pustaka yang saya gunakan membutuhkan versi lama. Masalah saya membawa saya pada pertanyaan ini.

Masalah dengan jawaban lain adalah bahwa mereka menggunakan versi dll yang sama untuk semua binding. Saya ingin menggunakan fitur-fitur di versi baru untuk yang lainnya kecuali ketergantungan lama.

Untuk dapat melakukannya, Anda perlu melakukan hal berikut:

  1. Mulailah dengan mengunduh versi lama (versi 1.2.11.0).
  2. Ubah nama biner yang diunduh menjadi log4net.1.2.10.dll. Sertakan dalam proyek startup Anda dengan tindakan Build disetel ke Nonedan "Salin jika lebih baru" masukkan deskripsi gambar di sini
  3. Beri tahu .NET di mana ia dapat menemukan versi lama:

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>

The hrefatribut mengidentifikasi di mana versi lama. Karenanya semua permintaan lain untuk log4net akan mengarah ke versi baru.

jgauffin.dll
sumber
4
Ini adalah solusi hebat karena memungkinkan Anda mempertahankan kedua versi untuk pustaka yang mereferensikannya.
SouthShoreAK
2
TERIMA KASIH! Ini menyelamatkan saya. Saya harus mengubah "Salin ke direktori keluaran" menjadi "Jangan salin", tetapi selain itu bekerja seperti pesona!
Daniel Hedenström
3

Anda dapat mengunduh versi log4net 1.2.11.0 yang ditandatangani dengan kunci lama. Alasan mengapa diubah ke kunci baru dijelaskan di FAQ mereka:

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

(Pada dasarnya kunci baru tersedia untuk umum dan untuk beberapa alasan mereka tidak ingin memasukkan kunci lama dalam distribusi. Tidak jelas bagi saya mengapa mereka tidak hanya membuat kunci lama tersedia untuk umum)

Stefan Egli
sumber
10
Tetapi ketika saya menggunakan pustaka pihak ketiga yang terkait dengan kunci baru, saya masih macet (bukan?). Bukan pilihan saya untuk menggunakan log4net baru, ini kerangka pihak ketiga. Saya tidak bisa melihat bagaimana hal ini tidak akan meledak di wajah semua orang karena semakin banyak kerangka kerja mulai menggunakan log4net dengan kunci baru
AndreasKnudsen
Sayangnya itu benar. Saya rasa Anda perlu mempertimbangkan untuk tidak meminta semua komponen menggunakan versi log4net yang sama ...
Stefan Egli
1
.... dan bagaimana saya akan melakukan itu? Apakah ada mekanisme di .net untuk menangani masalah ini?
AndreasKnudsen
1

Tidak tahu apakah itu cocok untuk kasus khusus Anda atau tidak, tetapi Anda dapat mengkompilasi ulang salah satu kerangka kerja, sehingga mereka akan menggunakan log4net dengan kunci publik yang sama. Dalam kasus saya itu adalah FluentNHibernate yang menggunakan log4net 1.2.10 dan Combres dengan log4net 1.2.11 dengan kunci baru. Saya mengunduh log4net 1.2.11 yang ditandatangani dengan kunci lama dan mengkompilasi ulang Combress dengannya. Setelah itu menambahkan pengalihan pengikatan perakitan dari 1.2.10 ke 1.2.11 dan itu mulai bekerja.

alex
sumber
0

Ini tidak selalu berfungsi di semua kasus, tetapi karena proyek yang menggunakan log4net adalah OSS, saya mengunduh sumbernya, mengganti versi log4net yang bertentangan dengan versi yang saya gunakan dan membangun kembali proyek tersebut. Dalam kasus saya itu adalah Topshelf, jadi saya sekarang memiliki versi rakitan Topshelf yang dibangun dengan versi log4net yang sama yang saya gunakan dan sekarang saya dapat mereferensikan keduanya tanpa masalah.

Mark J Miller
sumber
0

Saya mencoba membuka tautan yang disediakan di atas, tetapi sepertinya semua tautan di situs Apache tidak berfungsi. Maka inilah yang saya lakukan untuk menyelesaikan masalah:

Dari Visual Studio Anda, gunakan Nuget untuk mengunduh dan menginstal versi terbaru log4net (1.2.13.0). Manajer paket NuGet akan secara otomatis mengunduh dan meningkatkan semua log4net (1.2.11.0) ke versi terbaru.

George Huang
sumber