2009-09-04 25 views

Trả lời

52

Đó là khi ứng dụng A cài đặt Shared DLL v1. 0, Ứng dụng B đến và cập nhật Shared DLL thành v1.1 cần tương thích nhưng có những hành vi hơi khác nhau, sau đó ứng dụng A ngừng hoạt động chính xác và cài đặt lại v1.0 thì ứng dụng B dừng hoạt động ... bây giờ hãy tưởng tượng điều này với hơn 2 ứng dụng chúng ta hãy nói một chục: DLL Hell.

+7

Và vấn đề này hiện đang xảy ra với .NET, mặc dù nó ít phổ biến hơn. Nếu bạn có một ứng dụng sử dụng hai assembly, và cả hai đều sử dụng một assembly thứ ba thì bạn đang ở trong .NET Hell. Đặc biệt là nếu hai hội đồng đó sử dụng một phiên bản khác nhau của hội đồng thứ ba này ... –

+1

Nhưng chờ đợi, họ đã không giải quyết vấn đề này bằng cách thực hiện phiên bản song song? – user3509153

6

Tóm lại trong những ngày COM cũ tốt, mỗi thành phần COM phải được đăng ký (một mục được tạo trong sổ đăng ký) trước khi nó được sử dụng. Sau đó, chương trình của bạn sẽ tạo một đối tượng mới bằng cách cung cấp tên kiểu (đó là một khóa trong sổ đăng ký). Và bây giờ bạn không có bất kỳ kiểm soát nào dll sẽ thực sự được tải, bất kỳ phần mềm khác sẽ đăng ký một số phiên bản mới hơn/cũ/hoàn toàn khác của dll này, v.v.

4

Điều này xảy ra khi ứng dụng cài đặt dll vào hệ thống và một ứng dụng khác sẽ thay thế nó bằng một phiên bản khác của dll không tương thích với phiên bản cũ hơn.

Nó không phải là một vấn đề trong C# (và .NET nói chung) vì .NET assembly đủ thông minh để nhận biết phiên bản (và .NET có GAC quản lý các phiên bản khác nhau).

+2

Ngoại trừ .NET bỏ qua số sửa đổi (phần tử thứ 4 trong phiên bản) và có thể có các bản sửa đổi không tương thích. Đã xảy ra với một đồng nghiệp với một thành phần được cung cấp bởi Microsoft, không kém. –

+0

@Michael Borgwardt: Đó là một bổ sung có giá trị, cảm ơn bạn. –

12

DLL địa ngục chủ yếu là từ COM ngày, nơi một dll COM đã được đăng ký, và khách hàng của nó sẽ tìm nó trong sổ đăng ký. Đó là một cơn ác mộng vì hệ thống tập tin (* .dll, * .ocx) có thể được sửa đổi để lại các mục lỗi thời trong sổ đăng ký. Ứng dụng sẽ ngừng hoạt động, điều đó thật kinh khủng.

Sau đó, bạn sẽ nhận được tình huống trong đó ứng dụng mới cài đặt và đăng ký phiên bản DLL mới, do đó phá vỡ các ứng dụng thực sự muốn có phiên bản cũ. Bạn sẽ cài đặt lại ứng dụng cũ và ngắt ứng dụng mới trong quá trình này. Với .NET, không cần phải đăng ký các DLL (GAC là một trường hợp đặc biệt và có điều khoản để tránh vấn đề phiên bản được mô tả ở trên), bộ tải chỉ nhận các hội đồng bằng cách nhìn vào các đường dẫn chính xác.

+0

COM là gì? – user1534664

+5

Nó là viết tắt của Component Object Model (http://en.wikipedia.org/wiki/Component_Object_Model).Nó được coi là một cách phổ biến cho phần mềm Windows để nói chuyện với nhau/tái sử dụng thư viện, vv ActiveX là một ví dụ tốt. Một thư viện có thể trưng ra các giao diện COM vì nó là hợp đồng, và một ứng dụng khác được viết bằng một ngôn ngữ khác vẫn có thể sử dụng thư viện đó miễn là nó có hỗ trợ COM. Bất kỳ thư viện được xây dựng bằng cách sử dụng VB6 là thư viện COM - họ phải được đăng ký trong Windows registry cho các ứng dụng khác để khám phá chúng. –

5

Đơn giản - trong các phiên bản trước của cửa sổ, có thể có nhiều ứng dụng cố gắng truy cập cùng một thư viện được chia sẻ. Không có vấn đề ở đó, đó là lý do tại sao chúng được chia sẻ. vấn đề xảy ra khi các ứng dụng khác nhau đang cố truy cập các phiên bản khác nhau của cùng một cụm từ một vị trí trung tâm. Cung cấp tất cả các phiên bản sau của dll tương thích ngược và bạn có phiên bản mới nhất sẽ không có vấn đề gì, nhưng nếu bạn cài đặt một ứng dụng yêu cầu v2, sau đó cài đặt và ứng dụng yêu cầu (và bao gồm) phiên bản 1. x, bạn có thể thấy ứng dụng đầu tiên ngừng hoạt động (vì dll v2 đã bị ghi đè bằng phiên bản v1.x).

Phiên bản cửa sổ gần đây có khả năng lưu trữ nhiều phiên bản của một dll và cung cấp đúng phiên bản theo yêu cầu.

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