Có thể hai DLL xung đột, ngăn chặn giải pháp xây dựng


9

Mặc dù tôi có một trường hợp cụ thể, nhưng tôi đã tự hỏi về tình hình chung.

Hai DLL, khi được thêm làm Tham chiếu cho dự án Visual C # có thể va chạm với nhau để ngăn chặn giải pháp xây dựng không? Nếu đây là trường hợp, những cách có thể để giảm thiểu điều này là gì.

Câu trả lời:


13

Điều này là rất có thể.

Nếu bạn đã xác định một không gian tên và tên loại giống hệt nhau trên các tập hợp khác nhau (hoặc trong dự án của bạn và tập hợp được thêm vào), bạn sẽ có xung đột với bất kỳ mã nào cố gắng sử dụng một hoặc các loại khác.

Nếu bạn đảm bảo bạn có các không gian tên duy nhất, cũng như các tài liệu tham khảo của bạn, bạn sẽ không gặp phải vấn đề này.

Một khả năng khác có liên quan đến các phiên bản khác nhau của một phụ thuộc - nếu dự án của bạn sử dụng (ví dụ) thư viện ghi nhật ký ở phiên bản 1.2, nhưng hội đồng được thêm vào có sự phụ thuộc vào cùng một tổ hợp nhưng một phiên bản khác (giả sử 1.3) và dự án của bạn hoặc lắp ráp được thêm vào đã được cấu hình / xây dựng để sử dụng một phiên bản cụ thể, bạn sẽ gặp xung đột và quá trình xây dựng sẽ thất bại.

Cả hai vấn đề này có thể được giải quyết bằng cách sử dụng các bí danh lắp ráp, như được mô tả ở đây .


Tôi không hoàn toàn chắc chắn điều này là đúng. Nếu bạn nhìn vào CIL, CLR đề cập đến các biểu tượng một cách rõ ràng trong các hội đồng nhất định với ký hiệu [lắp ráp] trước mỗi biểu tượng. Có thể trình biên dịch C # thực thi vấn đề này, nhưng tôi không nghĩ đó là một hạn chế về nền tảng.
Yam Marcovic

@Yam Marcovic làm thế nào để trình biên dịch tìm ra không gian tên mà bạn đang cố sử dụng trong một lớp cụ thể? Xung đột tên lớp đủ điều kiện chắc chắn sẽ ngăn chặn việc xây dựng.
Jeremy

Trình biên dịch C # cung cấp cho bạn một tùy chọn cho các bí danh lắp ráp, khi xử lý các hội đồng cùng tên (và có thể có cùng các ký hiệu được định nghĩa trong chúng). Xem stackoverflow.com/questions/517058/
Mạnh

@Yam - Đúng, tuy nhiên, bạn cần biết về lá cờ này và sử dụng nó. Chỉ cần thêm lắp ráp sẽ phá vỡ các bản dựng.
Oded

1
Chắc chắn. Đó là lý do tại sao anh ta đến đây để được giúp đỡ, phải không? Anh ta muốn biết về lá cờ này và sử dụng nó, bởi vì nó sẽ cung cấp cho anh ta một giải pháp sạch hơn, mà không ảnh hưởng đến các tiện ích dự án hoặc bên thứ 3 của anh ta.
Yam Marcovic

4

Thấy không ai đề cập đến điều này, bạn hỏi:

những cách có thể để giảm thiểu điều này là gì

Có một giải pháp sạch chỉ dành cho trường hợp này, không có ràng buộc và không có cách giải quyết khó chịu. Bạn có thể định nghĩa hội đồng để trình biên dịch sẽ biết nên tham khảo cái nào ở đúng nơi.

Hãy xem http://bloss.msdn.com/b/ansonh/archive/2006/09/27/774692.aspx


3

Vâng, điều này là rất có thể.
Giả sử bạn đã thêm một tham chiếu đến một số DLL sử dụng phiên bản cũ của Lucene.Net và bạn muốn bao gồm phiên bản mới nhất.
Bạn có thể giải quyết vấn đề đó bằng cách sử dụng các bí danh bên ngoài: http://msdn.microsoft.com/en-us/l Library / ms173212.aspx


+1 đây có vẻ là câu trả lời đúng, không phải về bí danh "bên ngoài".
Jalayn

1

Bạn có thể đặt bao nhiêu phiên bản khác nhau của một hội đồng mà bạn muốn trong Bộ đệm ẩn hội đồng toàn cầu miễn là chúng có tên mạnh. Điều này có thể giúp bạn nếu bạn muốn các ứng dụng khác nhau sử dụng các phiên bản khác nhau của lắp ráp, thông minh theo máy. Tuy nhiên, việc sử dụng các phiên bản khác nhau của một hội đồng trong ứng dụng ONE vẫn sẽ khiến bạn gặp rắc rối.

Lý do để bạn cần cả hai phiên bản cùng một lúc là gì?


1
Vâng, tôi không rõ ràng thêm các phiên bản khác nhau. Về cơ bản tôi có một ứng dụng WPF. Bây giờ, để thêm tính năng của bên thứ ba, tôi đã thêm một số DLL và đó là những DLL có thể bị xung đột.
Shamim Hafiz

1
OK, sau đó bạn có thể thêm các DLL liên quan đến bên thứ ba này vào GAC? Đã lâu rồi tôi mới đọc về những điều đó nhưng tôi nghi ngờ điều này có thể giải quyết vấn đề của bạn.
Jalayn

GAC có nghĩa là gì ở đây?
Shamim Hafiz


0

Chắc chắn. Bạn có thể gặp lỗi trình biên dịch "Tham chiếu mơ hồ", khi hai đối tượng không thể phân biệt được. Thông thường, bạn có thể chỉ định đường dẫn đầy đủ trong mã và nó sẽ không gây ra sự cố, nhưng nếu các dll hoàn toàn giống nhau, thì bạn sẽ không thể phân biệt giữa hai đối tượng theo bất kỳ cách nào. Sya chúng tôi có hai dll:

System.IO chứa lớp File

MyProject.IO chứa một lớp Tệp

Nếu bạn có thứ gì đó như thế này ...

using System.IO;
using MyProject.IO;

...
private void foo()
{
    File f = new File();
}

... Bạn sẽ có một tài liệu tham khảo mơ hồ, vì không có cách nào để biết bạn đang nói về tập tin nào. Điều này sẽ khắc phục nó:

using System.IO;
using MyProject.IO;

...
private void foo()
{
    MyProject.IO.File f = new MyProject.IO.File();
}

Cách duy nhất khó khắc phục là nếu đường dẫn của "Tệp" giống hệt nhau trong cả hai cụm, nhưng điều đó sẽ đòi hỏi tình huống khó xảy ra khi hai dll có cấu trúc không gian tên giống hệt nhau. Ví dụ, tình huống của tôi ở trên sẽ không bao giờ xảy ra, vì không ai sẽ đặt tên cho dự án đó là "Hệ thống" (ngoại trừ các nhà phát triển thực tế của khung .Net).


Trên thực tế, điều đó xảy ra rất nhiều, nếu bạn xây dựng các giải pháp dựa trên các thư viện bên thứ ba phổ biến. Ví dụ: thư viện twitter có thể phụ thuộc vào phiên bản cũ hơn của json lib của bạn
Hoàng Long
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.