Wir haben ein asp.net 4.0-Projekt, das einige Frameworks verwendet, die von log4net Version 1.2.10.0 abhängig sind. Heute habe ich versucht, ein neues Framework aufzunehmen, das von log4net Version 1.2.11.0 abhängig ist. Seitdem stecke ich fest:
log4net 1.2.10.0 hat publickeytoken = 1b44e1d426115821
log4net 1.2.11.0 hat publickeytoken = 669e0ddf0bb1aa2a
Da diese unterschiedlich sind, kann ich weder Assembly-Weiterleitungen (damit alle Frameworks dieselbe Version von log4net verwenden) noch Codebasis (damit nur das neue Framework Version 1.2.11.0 verwendet) über das Laufzeitelement in web.config verwenden.
Welche Möglichkeiten habe ich hier?
(und warum der Signalton log4net immer wieder publickeytokens zwischen Versionen ändert, da ich verstehe, dass ein verlorener Schlüssel der Grund für den Wechsel zwischen Version 1.2.9.0 und 1.2.10.0 war, haben sie den Schlüssel noch einmal verloren? Ich werde meine Dropbox freiwillig zur Verfügung stellen um es sicher zu halten, wenn sie es brauchen ...)
Bearbeiten: Ok, also hatten die log4net-Leute anscheinend die Idee, dass das Freigeben mit zwei Schlüsseln eine gute Idee ist, aber das bedeutet, dass jedes Framework, das Sie verwenden, sich darauf einigen muss, welche der beiden Varianten sie bevorzugen, oder diese Frameworks können nicht funktionieren nebeneinander in der gleichen Appdomain. Bin ich der einzige, der dies für eine schreckliche Idee hält? Wenn jeder das tun würde, würde alles zusammenbrechen, oder?
Edit2: Wie bereits erwähnt, verwende ich in meinem Geschäftscode nicht log4net, sondern mehrere Frameworks, die von 1.2.10.0 abhängen. Das Problem trat auf, als ich versuchte, ein neues Framework zu verwenden, das von 1.2.11.0 abhing (neuer Schlüssel) ), daher trifft die Antwort von Stefans nicht zu, da das neue Framework den neuen Schlüssel erwartet, nicht den alten
quelle
Antworten:
So habe ich die Dinge mit Version 1.2.11.0 zum Laufen gebracht.
quelle
Method not found: 'Void log4net.Config.BasicConfigurator.Configure()'
Ich verwende die neueste Version von log4net, die ich über Nuget heruntergeladen habe. Für eine der von mir verwendeten Bibliotheken ist jedoch die alte Version erforderlich. Meine Probleme führten mich zu dieser Frage.
Das Problem mit den anderen Antworten ist, dass sie für alle Bindungen dieselbe DLL-Version verwenden. Ich möchte Funktionen in der neuen Version für alles andere als die Legacy-Abhängigkeit verwenden.
Um dies tun zu können, müssen Sie Folgendes tun:
log4net.1.2.10.dll
. Fügen Sie es in Ihr Startprojekt ein, wobei die Build-Aktion aufNone
"Kopieren, wenn neuer" gesetzt ist.App.config
Die
href
Attribute geben an, wo sich die alte Version befindet. Daher verweisen alle anderen Anfragen nach log4net auf die neue Version.quelle
Sie können eine Version von log4net 1.2.11.0 herunterladen, die mit dem alten Schlüssel signiert ist. Der Grund, warum der Schlüssel geändert wurde, wird in den häufig gestellten Fragen erläutert:
http://logging.apache.org/log4net/release/faq.html#two-snks
(Grundsätzlich ist der neue Schlüssel öffentlich verfügbar und aus irgendeinem Grund wollten sie den alten Schlüssel nicht in die Distribution aufnehmen. Mir ist nicht klar, warum sie den alten Schlüssel nicht nur öffentlich verfügbar gemacht haben.)
quelle
Ich weiß nicht, ob es für Ihren speziellen Fall geeignet ist oder nicht, aber Sie können eines der Frameworks neu kompilieren, sodass log4net mit demselben öffentlichen Schlüssel verwendet wird. In meinem Fall war es FluentNHibernate, das log4net 1.2.10 und Combres mit log4net 1.2.11 mit neuem Schlüssel verwendet. Ich habe log4net 1.2.11 heruntergeladen, mit altem Schlüssel signiert und Combress damit neu kompiliert. Nach dieser hinzugefügten Assembly-Bindungsumleitung von 1.2.10 auf 1.2.11 beginnt die Arbeit.
quelle
Dies funktioniert nicht unbedingt in allen Fällen, aber da das Projekt, das log4net verwendete, OSS war, habe ich die Quelle heruntergeladen, die widersprüchliche Version von log4net durch die von mir verwendete Version ersetzt und das Projekt neu erstellt. In meinem Fall war es Topshelf, daher habe ich jetzt eine Version der Topshelf-Assembly, die mit derselben Version von log4net erstellt wurde, die ich verwende, und jetzt kann ich problemlos auf beide verweisen.
quelle
Ich habe versucht, zu den oben angegebenen Links zu wechseln, aber anscheinend funktionieren alle Links auf der Apache-Site nicht. Dann habe ich Folgendes getan, um das Problem zu beheben:
Verwenden Sie Nuget in Ihrem Visual Studio, um die neueste Version von log4net (1.2.13.0) herunterzuladen und zu installieren. Der NuGet-Paketmanager lädt automatisch das gesamte log4net (1.2.11.0) herunter und aktualisiert es auf die neueste Version.
quelle