publickeytoken'ı değiştirmeye devam ederek log4net'te nasıl çalışırım


99

Log4net sürüm 1.2.10.0'a bağlı birkaç çerçeve kullanan bir asp.net 4.0 projemiz var. Bugün log4net 1.2.11.0 sürümüne bağlı yeni bir çerçeve eklemeye çalıştım, o zamandan beri sıkışıp kaldım:

log4net 1.2.10.0'da publickeytoken = 1b44e1d426115821 var

log4net 1.2.11.0'da publickeytoken = 669e0ddf0bb1aa2a var

Bunlar farklı olduğundan, web.config içindeki çalışma zamanı öğesi aracılığıyla derleme yeniden yönlendirmelerini (tüm çerçevelerin aynı log4net sürümünü kullanmasını sağlamak için) veya kod tabanını (yalnızca yeni çerçevenin 1.2.11.0 sürümünü kullanmasını sağlamak için) kullanamıyorum.

Burada benim seçeneklerim neler ?

(ve neden log4net bleep sürümler arasında publickeytokens değiştirmeye devam ediyor, anladığım kadarıyla 1.2.9.0 ve 1.2.10.0 sürümleri arasındaki geçişin nedeninin kayıp bir anahtar olduğunu anlıyorum, anahtarı yine mi kaybettiler? Dropbox'ımı gönüllü edeceğim İhtiyaç duyarlarsa güvende tutmak için ...)

Düzenleme: Tamam, yani log4net çalışanları görünüşe göre iki anahtarla yayınlamanın iyi bir fikir olduğu fikrine sahipti, ancak bu, kullandığınız her çerçevenin iki çeşniden hangisini tercih ettikleri veya bu çerçevelerin yan yana çalışamayacağı konusunda anlaşmaya ihtiyaç duyduğu anlamına geliyor. aynı appdomain içinde yan yana. Bunu korkunç bir fikir bulan tek kişi ben miyim? Bunu herkes yapsaydı her şey bozulur, değil mi?

Düzenleme2: Daha önce de belirttiğim gibi, işletme kodumda log4net kullanmıyorum, ancak 1.2.10.0'a bağlı birkaç çerçeve kullanıyorum ve 1.2.11.0'a (yeni anahtar) bağlı yeni bir çerçeve kullanmaya çalıştığımda sorun ortaya çıktı. ), bu yüzden Stefans'ın cevabı geçerli değil çünkü yeni çerçeve eskisini değil, yeni anahtarı bekleyecek


1
IMHO, apache'nin buradaki ilk hatası, yeni anahtarla imzalanmış ikili dosyaları sağlamaktır: yeni anahtar, yamalı / geliştirilmiş açık kaynak sürümüne yöneliktir ve olduğu gibi kullanılmamalıdır. İkinci hata, bahsettiğiniz çerçevenin yalnızca yeni log4net imzasıyla yayınlanmış olmasıdır: eski imzaya sahip bir sürüm mevcut olmalıdır.
JoeBilly

6
Aslında, üçüncü çeşide bakıyorsunuz: SAP'deki dahiler, Crystal Reports for Visual Studio paketinin bir parçası olarak kendi güçlü isimleriyle yeniden derlediler ve işleri daha da kötüleştirmek için, onu GAC'ye yapıştırdılar makineler arası bağımlılıklarınız bir kabus.
Jeremy Holovacs

Yanıtlar:


65

1.2.11.0 sürümüyle işleri böyle çalıştırdım.

  1. En başta anahtarı değiştirmek için lanet apache :)
  2. Eski anahtarla imzalanmış 1.2.11.0 sürümünü indirin .
  3. Log4net'e (yeni anahtar) doğrudan referansları kaldırarak kendi kodunuzu sıralayın ve eski anahtarla imzalanmış derleme referansıyla değiştirin.
  4. Bu segmenti web / app.config dosyanıza ekleyerek sahip olabileceğiniz bağımlı derlemeleri sıralayın.
   <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
Eski genel anahtarla imzalanmış sürümü indirmek, maalesef farklı bir genel anahtarla bir derlemeye bağlama yönlendirmesi gerçekleştirmek mümkün olmadığından gereklidir.
David Christiansen

2
Bu, 1.2.11.0'daki bir değişiklik nedeniyle başarısız görünüyor: netpl.blogspot.com/2012/03/…
sydneyos

@Sydneyos tarafından belirtilen bağlantıda açıklanan sorunlara aşağıdaki istisnaya neden olan bir çözüm bulan oldu mu:Method not found: 'Void log4net.Config.BasicConfigurator.Configure()'
Neo

Ne yazık ki 1.2.10 sürümüne düşürmek dışında bir çözüm yok. (veya kullandığınız her bağımlı derlemeyi yeniden derlemek).
bk0

1
1.2.10 derlemesini farklı bir dizine koyun ve şu yapılandırmayı kullanın: '<dependentAssembly> <assemblyIdentity name = "log4net" publicKeyToken = "1b44e1d426115821" culture = "nötr" /> <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

NuGet aracılığıyla indirdiğim log4net'in en son sürümünü kullanıyorum. Ancak kullandığım kitaplıklardan biri eski sürümü gerektiriyor. Dertlerim beni bu soruya yöneltti.

Diğer yanıtlarla ilgili sorun, tüm ciltlemeler için aynı dll sürümünü kullanıyor olmalarıdır. Yeni sürümdeki özellikleri eski bağımlılık dışındaki her şey için kullanmak istiyorum.

Bunu yapabilmek için aşağıdakileri yapmanız gerekir:

  1. Başlayın indirirken eski sürümü (1.2.11.0 sürümü).
  2. İndirilen ikili dosyayı olarak yeniden adlandırın log4net.1.2.10.dll. Oluştur eylemiNone "Daha yeniyse kopyala" olarak ayarlanmış şekilde başlangıç ​​projenize dahil edingörüntü açıklamasını buraya girin
  3. .NET'e eski sürümü nerede bulabileceğini söyleyin:

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>

hrefEski versiyonu tanımlayan bağlıyor. Bu nedenle, log4net için diğer tüm istekler yeni sürüme işaret edecektir.


4
Bu harika bir çözümdür çünkü her ikisine de başvuran kitaplıklar için her iki sürümü de korumanıza izin verir.
SouthShoreAK

2
TEŞEKKÜR EDERİM! Bu beni kurtardı. "Çıktı dizinine kopyala" yı "Kopyalama" olarak değiştirmek zorunda kaldım, ama aksi halde harika çalıştı!
Daniel Hedenström

3

Eski anahtarla imzalanmış log4net 1.2.11.0 sürümünü indirebilirsiniz. Yeni bir anahtara değiştirilmesinin nedeni, SSS'lerinde açıklanmıştır:

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

(Temel olarak yeni anahtar halka açıktır ve bazı nedenlerden dolayı eski anahtarı dağıtıma dahil etmek istemediler. Yine de neden eski anahtarı herkese açık hale getirmedikleri bana açık değil)


10
Ancak yeni anahtara bağlı bir üçüncü taraf kitaplığı kullandığımda, hala takılı kaldım (değil mi?). Yeni log4net'i kullanmak benim seçimim değil , bu üçüncü taraf çerçevesi. Ben daha çok çerçeveler yeni anahtarla log4net kullanmaya başlar karşıya bu malzeme herkesin içinde havaya uçurmak için gitmiyor nasıl göremiyorum
AndreasKnudsen

Bu maalesef doğru. Sanırım tüm bileşenlerin aynı log4net sürümünü kullanmamasını düşünmeniz gerekiyor ...
Stefan Egli

1
.... ve bunu nasıl yapacağım? .Net'te bu sorunu ele almak için herhangi bir mekanizma var mı?
AndreasKnudsen


1

Sizin durumunuza uygun olup olmadığını bilmiyorum, ancak çerçevelerden birini yeniden derleyebilirsiniz, böylece log4net'i aynı açık anahtarla kullanacaklardır. Benim durumumda log4net 1.2.10 ve yeni anahtarla log4net 1.2.11 ile Combres kullanan FluentNHibernate idi. Eski anahtarla imzalanmış log4net 1.2.11'i indirdim ve onunla Combress'i yeniden derledim. Bundan sonra 1.2.10'dan 1.2.11'e derleme bağlama yönlendirmesi eklendi ve çalışmaya başlar.


0

Bu her durumda işe yaramayacaktır, ancak log4net kullanan proje OSS olduğu için kaynağı indirdim, log4net'in çakışan sürümünü kullandığım sürümle değiştirdim ve projeyi yeniden oluşturdum. Benim durumumda bu Topshelf'ti, bu yüzden şimdi kullandığım log4net'in aynı sürümü ile oluşturulmuş bir Topshelf derlemesine sahibim ve şimdi her ikisine de sorunsuz bir şekilde başvurabilirim.


0

Yukarıda verilen bağlantılara gitmeyi denedim, ancak Apache sitesindeki tüm bağlantılar çalışmıyor gibi görünüyor. O zaman sorunu çözmek için bunu yaptım:

Visual Studio'nuzdan log4net'in en son sürümünü (1.2.13.0) indirip yüklemek için Nuget'i kullanın. NuGet paket yöneticisi, tüm log4net'i (1.2.11.0) otomatik olarak indirip en son sürüme yükseltir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.