Tôi tiếp tục nghe về địa ngục DLL - tất cả điều này là gì?Tôi tiếp tục nghe về địa ngục DLL - đây là gì?
Trả lời
Đó 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.
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 ... –
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
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.
Đ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).
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. –
@Michael Borgwardt: Đó là một bổ sung có giá trị, cảm ơn bạn. –
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.
COM là gì? – user1534664
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. –
Đơ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.
- 1. Địa chỉ WCF Địa ngục?
- 2. vftable - đây là gì?
- 3. Loại động C# - trời hay địa ngục?
- 4. Tôi tiếp tục thấy + - + trong nhật ký apache của tôi, nó là gì?
- 5. dll là gì?
- 6. Dll cướp là gì?
- 7. DLL gốc là gì?
- 8. Địa ngục classpath là gì và liệu nó có thực sự là một vấn đề đối với Java không?
- 9. Đây là gì (())?
- 10. _NSZombie_NSKeyValueUndefinedGetter - Đây là gì?
- 11. mã hóa địa ngục Đức ký tự đặc biệt
- 12. Dll interop là gì?
- 13. lệnh adb địa ngục (không phải là một lỗi đánh máy)
- 14. Alternatives/Công cụ cho #define địa ngục C/C++
- 15. Công cụ tốt nhất để tìm ra một DLL VB6 DLL khác được tham chiếu đến là gì?
- 16. đây là những gì: ส็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็
- 17. Tiếp tục được coi là có hại?
- 18. Lỗi 'bắt buộc từ đây' là gì
- 19. useMethod có nghĩa là gì ở đây?
- 20. DLL un/managed là gì? Mã un/managed là gì?
- 21. Đây có phải là địa chỉ email hợp lệ không?
- 22. Valgrind có nghĩa là gì bởi "chuyển đến địa chỉ không hợp lệ" ở đây?
- 23. Sao chép các dll địa phương và hệ thống '- điểm là gì?
- 24. Làm thế nào để giải quyết Antlr3 phụ thuộc địa ngục
- 25. Thực thi Javascript CPS (tiếp tục theo kiểu tiếp tục)
- 26. Chuỗi Unicode sau đây là gì?
- 27. Đây là gì _n_ Ruby ko?
- 28. Thu thập GC ở đây là gì?
- 29. "tiếp tục" trong cursor.forEach()
- 30. Việc đăng ký một DLL là gì?
Đó là thứ đã được thay thế bởi .NET Hell. ;-) –
... và nuget hell –