Tham chiếu 2 phiên bản log4net khác nhau trong cùng một giải pháp


80

Tôi đang sử dụng NHibernate 2.1.2.400 đang tham chiếu đến log4net 1.2.10.0. Trong cùng một dự án, tôi cũng sử dụng SDK kế toán đơn giản, đáng buồn là nó vẫn đang sử dụng log4net 1.2.9.0.

Vì vậy, tôi có thể làm cho NHibernate hoạt động nếu tôi tham chiếu log4net 1.2.10.0 nhưng simpleSDK không hoạt động. Và ngược lại...

Tôi đoán hầu hết các vấn đề xuất phát từ thực tế là log4net đã thay đổi khóa lắp ráp của nó. Tôi đã thử sử dụng chuyển hướng ràng buộc mà không thành công: 2 DLL không có cùng một khóa.

Tôi đang xem xét biên dịch lại NHibernate để sử dụng log4net 1.2.9.0 nhưng có vẻ như điều sai lầm nên làm và cảm giác của tôi là Simply Accounting sẽ không sớm cập nhật SDK của họ để sử dụng log4net 1.2.10.0.

cách tốt nhất để xử lý này là gì? Có thể giải quyết ở tất cả?


2
Tôi có một câu hỏi tương tự tại stackoverflow.com/questions/1744543/… Tôi đã sử dụng đến biên dịch lại. Tôi đoán đây là sự ra đời của dll-hell v2.0.
Sandor Drieënhuizen

1
trong khi kiểm tra câu hỏi của bạn, tôi thấy stackoverflow.com/questions/2460542/2461746#2461746 đã khắc phục sự cố của tôi.
Joel Gauvreau

Tuyệt quá! Tôi đã tự hỏi về việc làm cho CLR trông ở các vị trí khác nhau và hrefthuộc tính dường như thực hiện thủ thuật. Cảm ơn vì đã chỉ ra điều đó!
Sandor Drieënhuizen

Câu trả lời:


149

Tôi đã tìm thấy giải pháp bằng cách sử dụng câu trả lời này cho một câu hỏi tương tự

Bạn tạo 2 thư mục trong dự án của mình, mỗi thư mục cho mỗi phiên bản của log4net. Đặt từng log4net.dll vào thư mục tương ứng của nó bằng cách thêm tệp vào giải pháp (không thêm tham chiếu). Bạn có thể đặt thuộc tính thư mục sao chép vào đầu ra luôn sao chép để nó được tự động sao chép vào thư mục đầu ra khi bạn xây dựng.

Sau đó, bạn sửa đổi tệp app.config bằng cách thêm một cái gì đó như sau:

<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="log4net" publicKeyToken="681549d62126b7b8" />
        <codeBase version="1.2.9.0" href="log4netv1.2.9.0\log4net.dll" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="log4net" publicKeyToken="1b44e1d426115821" />
        <codeBase version="1.2.10.0" href="log4netv1.2.10.0\log4net.dll" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="log4net" publicKeyToken="669e0ddf0bb1aa2a" />
        <codeBase version="1.2.11.0" href="log4net.dll" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

bạn có thể lấy mã thông báo khóa công khai của một assembly bằng cách sử dụng sn -T [assemblyName]


2
Điều này dường như cũng làm việc cho tôi. Tôi đã xóa log4net khỏi danh sách Tham chiếu của mình cho dự án mà xung đột đang xảy ra. Ngoài ra, vì log4net.dll không có trong các thư mục bin của tôi, nên các đường dẫn href của tôi trông giống như ".. \ .. \ .. \ .. \ Lib \ NHibernate-2.0.1.GA \ log4net.dll" - chỉ là một đường dẫn tương đối đến vị trí log4net sẽ ở trên mọi máy của nhà phát triển với hệ thống xây dựng của chúng tôi.
jyoungdev 13/10/10

12
Tôi không chắc tôi hiểu điều này: làm thế nào để bạn không gặp lỗi biên dịch nếu log4net không được tham chiếu?
guideupuy

2
Điều này thật tuyệt vời, nó sẽ khắc phục các trường hợp khác trong đó chuyển hướng ràng buộc đơn giản cũng sẽ phá vỡ mọi thứ do các thay đổi API!
Rhys Bevilaqua

5
@guidupy, bạn có thể tham chiếu đến log4net mà mã của bạn sử dụng, nhưng hãy tắt copyLocal trong thuộc tính.
Jeff Martin

4
cho những người đọc trong tương lai (một gợi ý tôi đã tìm thấy từ một câu trả lời khác, nhưng hãy cẩn thận khi đăng ở đây) ... đối với ứng dụng web (asp.net), tham chiếu có một tinh chỉnh: <codeBase version = "1.0.0.0" href = "bin \ folder \ namell.dll "/>
granadaCoder

7

Bạn có thể thêm một loại trừ vào sổ đăng ký. Chỉ cần thêm các khóa sau:

HKEY_LOCAL_MACHINE\Software\Microsoft\StrongName\Verification\log4net,681549d62126b7b8
HKEY_LOCAL_MACHINE\Software\Microsoft\StrongName\Verification\log4net,1b44e1d426115821
HKEY_LOCAL_MACHINE\Software\Microsoft\StrongName\Verification\log4net,669e0ddf0bb1aa2a

Điều này sẽ làm cho thời gian chạy .net bỏ qua xác thực cho các hội đồng được liệt kê. Về lý thuyết, đây là một vấn đề bảo mật, nhưng vì dù sao thì private key vẫn ở trạng thái mở nên hầu như không có bất kỳ tác động nào.


Như bạn đã nói, đây là một vấn đề bảo mật. Ngoài ra, điều này ám chỉ rằng bạn phải thực hiện những thay đổi đó trên mọi máy trạm chạy phần mềm. Trong một mạng lưới doanh nghiệp phức tạp, những thứ này cộng lại sẽ tạo thành một mớ hỗn độn lớn. Tôi muốn tránh nó càng nhiều càng tốt. Các giải pháp khác là độc lập và di động.
Joel Gauvreau

Như tôi đã nói, bởi vì các khóa riêng tư vẫn được công bố công khai, nên không có vấn đề bảo mật thực sự nào cả. Đặc biệt là trong một mạng doanh nghiệp, việc cấu hình một Đối tượng Chính sách Nhóm đơn lẻ sẽ dễ dàng hơn so với việc cấu hình điều này cho mọi ứng dụng LOB đang được sử dụng. Bạn có thể định cấu hình nó một lần ở cấp độ miền và không bao giờ phải nghĩ về nó nữa.
Joep Beusenberg

3

Nếu chuyển hướng liên kết không hoạt động và SDK kế toán đơn giản là nguồn đóng, giải pháp khả thi là biên dịch lại NHibernate để sử dụng log4net 1.2.9.0.


3
Điều đó sẽ hiệu quả, nhưng phải xây dựng một phiên bản đặc biệt của nhibernate sẽ khó hỗ trợ hơn ... cảm ơn.
Joel Gauvreau
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.