làm cách nào để giải quyết vấn đề log4net tiếp tục thay đổi publickeytoken


99

Chúng tôi có một dự án asp.net 4.0 sử dụng một vài khung công tác phụ thuộc vào phiên bản log4net 1.2.10.0. Hôm nay tôi đã cố gắng đưa vào một khung công tác mới phụ thuộc vào phiên bản log4net 1.2.11.0, tôi đã bị mắc kẹt kể từ đó:

log4net 1.2.10.0 có publickeytoken = 1b44e1d426115821

log4net 1.2.11.0 có publickeytoken = 669e0ddf0bb1aa2a

Vì chúng khác nhau nên tôi không thể sử dụng chuyển hướng lắp ráp (để làm cho tất cả các khung sử dụng cùng một phiên bản log4net) hoặc codebase (để chỉ sử dụng khung mới phiên bản 1.2.11.0) thông qua phần tử thời gian chạy trong web.config.

Lựa chọn của tôi là gì đây ?

(và lý do tại sao log4net tiếp tục thay đổi mã thông báo công khai giữa các phiên bản, theo tôi hiểu đó là một khóa bị mất là lý do chuyển đổi giữa phiên bản 1.2.9.0 và 1.2.10.0, họ đã đánh mất khóa một lần nữa không? Tôi tình nguyện làm tài khoản đăng của mình để giữ an toàn nếu họ cần ...)

Chỉnh sửa: Ok, vì vậy những người đăng nhập log4net rõ ràng có ý tưởng rằng việc phát hành với hai khóa là một ý tưởng hay, nhưng điều đó có nghĩa là mọi khung công tác bạn sử dụng cần phải thống nhất với nhau về hương vị nào trong số hai hương vị mà họ thích, hoặc những khung công tác đó không thể hoạt động cùng nhau cạnh nhau trong cùng một miền ứng dụng. Tôi có phải là người duy nhất thấy đây là một ý tưởng kinh khủng không? nếu tất cả mọi người làm điều này thì mọi thứ sẽ đổ vỡ, phải không?

Chỉnh sửa2: Như tôi đã nêu, tôi không sử dụng log4net trong mã doanh nghiệp của mình, nhưng tôi sử dụng một số khung phụ thuộc vào 1.2.10.0 và vấn đề đã phát sinh khi tôi cố gắng sử dụng khung mới phụ thuộc vào 1.2.11.0 (khóa mới ), vì vậy câu trả lời của Stefans không áp dụng, bởi vì khuôn khổ mới sẽ mong đợi khóa mới, không phải khóa cũ


1
IMHO, lỗi đầu tiên từ apache ở đây là cung cấp mã nhị phân được ký bằng khóa mới: khóa mới dành cho phiên bản nguồn mở được vá / nâng cao và không nên được sử dụng như hiện tại. Lỗi thứ hai là khuôn khổ bạn đang nói đến đã được phát hành chỉ với chữ ký log4net mới: một phiên bản có chữ ký cũ sẽ tồn tại.
JoeBilly

6
Trên thực tế, bạn đang xem xét hương vị thứ ba: hương vị mà các thiên tài tại SAP đã biên dịch lại với tên riêng của họ, như là một phần của gói Crystal Reports cho Visual Studio và để làm cho vấn đề tồi tệ hơn, họ đã gắn nó vào GAC, điều này sẽ làm cho sự phụ thuộc của bạn trên các máy là một cơn ác mộng.
Jeremy Holovacs

Câu trả lời:


65

Đây là cách tôi làm cho mọi thứ hoạt động với phiên bản 1.2.11.0.

  1. Lời nguyền apache vì đã thay đổi khóa ngay từ đầu :)
  2. Tải xuống phiên bản 1.2.11.0 được ký bằng khóa cũ.
  3. Sắp xếp mã của riêng bạn bằng cách xóa mọi tham chiếu trực tiếp đến log4net (khóa mới) và thay thế bằng tham chiếu đến hợp ngữ được ký bằng khóa cũ.
  4. Sắp xếp mọi tập hợp phụ thuộc mà bạn có thể có bằng cách đưa phân đoạn này vào web / app.config của bạ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
Việc tải xuống phiên bản được ký bằng khóa công khai cũ là cần thiết vì rất tiếc là không thể thực hiện chuyển hướng ràng buộc đến một hội đồng có khóa công khai khác.
David Christiansen

2
Điều này dường như không thành công do thay đổi đột ngột trong 1.2.11.0: netpl.blogspot.com/2012/03/…
sydneyos

Có ai đã tìm thấy giải pháp cho các vấn đề được mô tả tại liên kết được đề cập bởi @sydneyos gây ra ngoại lệ sau đây không:Method not found: 'Void log4net.Config.BasicConfigurator.Configure()'
Neo

Thật không may, không có giải pháp nào khác ngoài việc hạ cấp xuống 1.2.10. (hoặc biên dịch lại mọi cụm phụ thuộc mà bạn sử dụng).
bk0

1
Đặt lắp ráp 1.2.10 vào một thư mục khác và sử dụng cấu hình này: '<dependentAssembly> <assemblyIdentity name = "log4net" publicKeyToken = "1b44e1d426115821" culture = "trung lập" /> <bindRedirect 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

Tôi đang sử dụng phiên bản log4net mới nhất mà tôi đã tải xuống thông qua nuget. Tuy nhiên, một trong những thư viện mà tôi đang sử dụng yêu cầu phiên bản cũ. Những rắc rối của tôi đã dẫn tôi đến câu hỏi này.

Vấn đề với các câu trả lời khác là chúng đang sử dụng cùng một phiên bản dll cho tất cả các ràng buộc. Tôi muốn sử dụng các tính năng trong phiên bản mới cho mọi thứ khác trừ phần phụ thuộc kế thừa.

Để có thể làm được điều đó, bạn cần làm như sau:

  1. Bắt đầu bằng cách tải xuống phiên bản cũ (phiên bản 1.2.11.0).
  2. Đổi tên tệp nhị phân đã tải xuống thành log4net.1.2.10.dll. Bao gồm nó trong dự án khởi động của bạn với Hành động xây dựng được đặt thành Nonevà "Sao chép nếu mới hơn" nhập mô tả hình ảnh ở đây
  3. Cho .NET biết nơi nó có thể tìm thấy phiên bản cũ:

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>

Các hrefthuộc tính xác định vị trí của phiên bản cũ. Do đó, tất cả các yêu cầu khác cho log4net sẽ chỉ trên phiên bản mới.


4
Đây là một giải pháp tuyệt vời vì nó cho phép bạn duy trì cả hai phiên bản cho các thư viện tham chiếu.
SouthShoreAK

2
CẢM ƠN BẠN! Điều này đã cứu tôi. Tôi đã phải thay đổi "Thư mục sao chép vào đầu ra" thành "Không sao chép", nhưng nếu không nó hoạt động như một sự quyến rũ!
Daniel Hedenström

3

Bạn có thể tải xuống phiên bản log4net 1.2.11.0 được ký bằng khóa cũ. Lý do tại sao thay đổi thành khóa mới được giải thích trong Câu hỏi thường gặp của họ:

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

(Về cơ bản, khóa mới được cung cấp công khai và vì một số lý do họ không muốn đưa khóa cũ vào bản phân phối. Tôi không rõ tại sao họ không công khai khóa cũ)


10
Nhưng khi tôi sử dụng thư viện của bên thứ ba được liên kết với khóa mới, tôi vẫn bị mắc kẹt (phải không?). Tôi không lựa chọn sử dụng log4net mới, đó là khuôn khổ của bên thứ ba. Tôi không thể nhìn thấy như thế nào công cụ này sẽ không thổi lên trong everyones đối mặt khi ngày càng nhiều các khuôn khổ bắt đầu sử dụng log4net với phím mới
AndreasKnudsen

Điều đó thật không may là chính xác. Tôi đoán bạn cần phải xem xét không có tất cả các thành phần sử dụng cùng một phiên bản của log4net ...
Stefan Egli

1
.... và làm thế nào tôi sẽ làm điều đó? Có cơ chế nào trong .net để xử lý vấn đề này không?
AndreasKnudsen


1

Không biết nó có phù hợp với trường hợp cụ thể của bạn hay không, nhưng bạn có thể biên dịch lại một trong các khuôn khổ, vì vậy chúng sẽ sử dụng log4net với cùng một khóa công khai. Trong trường hợp của tôi, đó là FluentNHibernate sử dụng log4net 1.2.10 và Kết hợp với log4net 1.2.11 với khóa mới. Tôi đã tải xuống log4net 1.2.11 được ký bằng khóa cũ và đã biên dịch lại Combress với nó. Sau đó, chuyển hướng liên kết lắp ráp được thêm vào đó từ 1.2.10 đến 1.2.11 và nó bắt đầu hoạt động.


0

Điều này sẽ không nhất thiết hoạt động trong mọi trường hợp, nhưng vì dự án đang sử dụng log4net là OSS nên tôi đã tải xuống nguồn, thay thế phiên bản xung đột của log4net bằng phiên bản tôi đang sử dụng và xây dựng lại dự án. Trong trường hợp của tôi, đó là Topshelf, vì vậy tôi hiện có phiên bản lắp ráp Topshelf được xây dựng với cùng phiên bản log4net mà tôi đang sử dụng và bây giờ tôi có thể tham chiếu cả hai mà không gặp vấn đề gì.


0

Tôi đã cố gắng truy cập các liên kết được cung cấp ở trên, nhưng có vẻ như tất cả các liên kết trong trang Apache đều không hoạt động. Sau đó, đây là những gì tôi đã làm để giải quyết vấn đề:

Từ Visual Studio của bạn, sử dụng Nuget để tải xuống và cài đặt phiên bản mới nhất của log4net (1.2.13.0). Trình quản lý gói NuGet sẽ tự động tải xuống và nâng cấp tất cả log4net (1.2.11.0) lên phiên bản mới nhất.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.