2013-02-06 29 views
10

Cách khắc phục?Cách giải quyết .NET Dll Hell?

Tôi có 2 hội đồng bên thứ 3, sử dụng NewtonSoftJson.dll. Việc bắt giữ là một trong số họ sử dụng phiên bản 3.x.x cũ và một phiên bản khác sử dụng 4.5.x. Vì vậy, tại thời gian chạy ít nhất 1 trong 2 hội đồng than phiền về người kia.

Tôi làm cách nào để giải quyết vấn đề này? Tôi có thể thiết lập dịch vụ, nhưng mã và môi trường hiện không được thiết lập theo cách đó. Nó cũng tái cấu trúc quá nhiều hơn có thể được thực hiện một cách an toàn trong một khoảng thời gian nhất định.

+0

Có phải cả hai hội đồng trong cùng một thư mục không? –

+0

Điều này có thể giúp: http://blogs.msdn.com/b/abhinaba/archive/2005/11/30/498278.aspx – Oded

+1

http://stackoverflow.com/questions/3158928/referencing-2-differents-versions -of-log4net-in-the-same-solution – Oded

Trả lời

4

Tôi tình cờ gặp vấn đề chính xác với Newtonsoft và một thư viện của bên thứ ba khác. Vấn đề với Newtonsoft v3.x và v4.x là thư viện mới hơn bây giờ đi kèm với một mã thông báo khóa công khai. Điều này làm cho giải pháp chuyển hướng lắp ráp vô ích; nhưng nó là một giải pháp hoàn hảo hợp lệ cho hầu hết các trường hợp khác.

Tôi đã tự mình thực hiện lại thư viện của bên thứ ba. Nếu bạn có quyền truy cập vào mã nguồn của thư viện của bên thứ ba, bạn luôn có thể xây dựng lại thư viện bằng cách sử dụng DLL Newtonsoft mới hơn. Bạn có thể cần thực hiện các thay đổi nhỏ nếu bất kỳ chữ ký phương thức nào đã thay đổi.

+0

Chạy cùng một vấn đề, tải xuống ứng dụng LITTLE (chỉ cần một vài Kbs) và cần một phiên bản khung mà tôi không có. Để cài đặt nó, bạn phải tự tìm kiếm nó có thể dẫn đến thất vọng (phiên bản địa ngục). Nó là một ứng dụng LITTLE nhưng cần phân bổ nhảm nhí xung quanh nó. Sau khi cài đặt khung, nó cần cập nhật (giống như cập nhật vô tận). Đây không phải là cách rất thân thiện và không lành mạnh để triển khai một ứng dụng.Bây giờ tôi hiểu lý do tại sao Windows là rất lớn và bây giờ tôi biết tại sao có rất nhiều người đàn ông không có lông đậm trên thế giới. Hãy suy nghĩ hai lần để sử dụng .NET cho các sản phẩm của bạn. – Codebeat

3

Các bài viết Microsoft "Redirecting Assembly Versions" đã cho biết:

Ví dụ sau đây cho thấy làm thế nào để chuyển hướng một phiên bản của myAssembly khác, và tắt chính sách xuất bản cho mySecondAssembly.

<configuration> 
    <runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <dependentAssembly> 
     <assemblyIdentity name="myAssembly" 
      publicKeyToken="32ab4ba45e0a69a1" 
      culture="en-us" /> 
     <!-- Assembly versions can be redirected in application, 
      publisher policy, or machine configuration files. --> 
     <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0" /> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="mySecondAssembly" 
     publicKeyToken="32ab4ba45e0a69a1" 
     culture="en-us" /> 
     <!-- Publisher policy can be set only in the application 
      configuration file. --> 
     <publisherPolicy apply="no" /> 
     </dependentAssembly> 
    </assemblyBinding> 
    </runtime> 
</configuration> 
+2

Bạn có thể chỉ cho bạn cách thực hiện việc này để mỗi lắp ráp có phụ thuộc vào phiên bản khác của 'NewtonSoftJson' có phiên bản chính xác không? – Oded

+0

@Oded: Tôi không thể. Tôi không có thời gian để khám phá điều này. Có lẽ cuối tuần này. –

2

Thông thường, bạn giải quyết điều này thông qua cấu hình trong app/web cấu hình của bạn. Bạn có thể sử dụng phần tử thăm dò để chỉ định đường dẫn riêng và đặt hai phiên bản vào các thư mục riêng biệt:

<configuration> 
    <runtime> 
     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <probing privatePath="bin;bin2\subbin;bin3"/> 
     </assemblyBinding> 
    </runtime> 
</configuration> 

Cách khác là sử dụng chuyển hướng ràng buộc lắp ráp. Nhưng điều đó sẽ chỉ hoạt động nếu bạn biết rằng các phiên bản tương thích. Vì bạn không sử dụng chúng trực tiếp Tôi không chắc bạn biết điều đó và nhà xuất bản đã chỉ ra một số không tương thích bằng cách thay đổi phiên bản lắp ráp.

1

Đã kết thúc bằng cách sử dụng trình dịch ngược, thêm dự án vào giải pháp, tham khảo dll mới, sửa lỗi và biên dịch lại, trỏ đến dự án được thêm gần đây.

Tôi không thể sử dụng chuyển hướng lắp ráp vì mã thông báo khóa công khai đã thay đổi. Rõ ràng là một khóa khác được sử dụng để biên dịch 1 trong các hội đồng được tham chiếu. Đã phải sử dụng các biện pháp quyết liệt hơn.

Các vấn đề liên quan