Chính xác thì các tập tin DLL là gì và chúng hoạt động như thế nào?


224

Làm thế nào chính xác các tập tin DLL hoạt động? Dường như có rất nhiều trong số họ, nhưng tôi không biết chúng là gì hoặc chúng hoạt động như thế nào.

Vì vậy, những gì đối phó với họ?


6
Vì đây chỉ được gắn thẻ với Windows và câu hỏi này đã được viết lại vào năm 2008, nên đáng nói là ngày nay dll cũng chạy trên Mac và Linux với .NET Core.
Jim Aho

Câu trả lời:


287

DLL là gì?

Thư viện liên kết động (DLL) giống như EXE nhưng chúng không thể thực thi trực tiếp. Chúng tương tự như các tệp .so trong Linux / Unix. Điều đó có nghĩa là, DLL là MS thực hiện các thư viện chia sẻ.

DLL rất giống với một EXE mà định dạng tệp là như nhau. Cả EXE và DLL đều dựa trên định dạng tệp Portable Executable (PE). DLL cũng có thể chứa các thành phần COM và thư viện .NET.

DLL chứa gì?

DLL chứa các hàm, lớp, biến, UI và tài nguyên (như biểu tượng, hình ảnh, tệp, ...) mà EXE hoặc DLL khác sử dụng.

Các loại thư viện:

Trên hầu như tất cả các hệ điều hành, có 2 loại thư viện. Thư viện tĩnh và thư viện động. Trong các cửa sổ, phần mở rộng tệp như sau: Thư viện tĩnh (.lib) và thư viện động (đậm). Sự khác biệt chính là các thư viện tĩnh được liên kết với tệp thực thi tại thời gian biên dịch; trong khi các thư viện liên kết động không được liên kết cho đến thời gian chạy.

Thêm về thư viện tĩnh và động:

Bạn thường không thấy các thư viện tĩnh mặc dù trên máy tính của mình, vì thư viện tĩnh được nhúng trực tiếp bên trong mô-đun (EXE hoặc DLL). Một thư viện động là một tập tin độc lập.

Một DLL có thể được thay đổi bất cứ lúc nào và chỉ được tải khi chạy khi EXE tải DLL một cách rõ ràng. Không thể thay đổi thư viện tĩnh sau khi được biên dịch trong EXE. Một DLL có thể được cập nhật riêng mà không cần cập nhật EXE.

Đang tải một DLL:

Một chương trình tải một DLL khi khởi động, thông qua Win32 API LoadL Library hoặc khi nó là một phụ thuộc của một DLL khác. Một chương trình sử dụng GetProcAddress để tải một hàm hoặc LoadResource để tải tài nguyên.

Đọc thêm:

Vui lòng kiểm tra MSDN hoặc Wikipedia để đọc thêm. Cũng là nguồn của câu trả lời này.


5
Có lẽ nên đề cập đến lib nhập ở đâu đó. OK tôi sẽ đi ngay bây giờ. :)
Adam Mitz

2
Loại bỏ những cái mà dường như được giải quyết. Làm thế nào để tôi có được điểm cho điều này? <g>
Adam Mitz

36

DLL là gì?

Các tệp DLL là các tệp nhị phân có thể chứa mã thực thi và tài nguyên như hình ảnh, v.v. Không giống như các ứng dụng, chúng không thể được thực thi trực tiếp, nhưng một ứng dụng sẽ tải chúng theo yêu cầu (hoặc tất cả cùng một lúc trong khi khởi động).

Họ có quan trọng không?

Hầu hết các ứng dụng sẽ tải các tập tin DLL mà họ yêu cầu khi khởi động. Nếu không tìm thấy bất kỳ thứ nào trong số này, hệ thống sẽ không thể bắt đầu quá trình.

Tệp DLL có thể yêu cầu các tệp DLL khác

Theo cùng một cách mà một ứng dụng yêu cầu tệp DLL, một tệp DLL có thể phụ thuộc vào chính các tệp DLL khác. Nếu không tìm thấy một trong các tệp DLL trong chuỗi phụ thuộc này, ứng dụng sẽ không tải. Điều này được gỡ lỗi dễ dàng bằng cách sử dụng bất kỳ công cụ đi bộ phụ thuộc nào, như Dependency Walker .

Có rất nhiều trong số chúng trong các thư mục hệ thống

Hầu hết các chức năng hệ thống được tiếp xúc với một chương trình người dùng ở dạng tệp DLL vì chúng là một hình thức chia sẻ mã / tài nguyên tiêu chuẩn. Mỗi chức năng được giữ riêng trong các tệp DLL khác nhau để chỉ các tệp DLL được yêu cầu sẽ được tải và do đó giảm các ràng buộc bộ nhớ trên hệ thống.

Các ứng dụng đã cài đặt cũng sử dụng tập tin DLL

Các tập tin DLL cũng trở thành một hình thức phân tách các chức năng vật lý như được giải thích ở trên. Các ứng dụng tốt cũng cố gắng không tải các tập tin DLL cho đến khi chúng hoàn toàn được yêu cầu, điều này làm giảm yêu cầu bộ nhớ. Điều này cũng khiến các ứng dụng xuất xưởng với rất nhiều tệp DLL.

Địa ngục DLL

Tuy nhiên, đôi khi các nâng cấp hệ thống thường phá vỡ các chương trình khác khi có phiên bản không khớp giữa các tệp DLL được chia sẻ và chương trình yêu cầu chúng. Các điểm kiểm tra hệ thống và bộ đệm DLL, v.v. đã là những sáng kiến ​​từ M $ để giải quyết vấn đề này. Nền tảng .NET có thể không phải đối mặt với vấn đề này.

Làm thế nào để chúng ta biết những gì bên trong một tập tin DLL?

Bạn phải sử dụng một công cụ bên ngoài như DUMPBIN hoặc Dependency Walker, nó sẽ không chỉ hiển thị các chức năng hiển thị công khai (được gọi là xuất khẩu) được chứa trong các tệp DLL và cả các tệp DLL khác mà nó yêu cầu và xuất từ ​​các tệp DLL này tệp DLL này là phụ thuộc vào.

Làm thế nào để chúng ta tạo / sử dụng chúng?

Tham khảo tài liệu lập trình từ nhà cung cấp của bạn. Đối với C ++, hãy tham khảo LoadL Library trong MSDN.


2
Vui lòng hoàn thành câu này ( "The .NET platform might not face this issue at all.") với một lý do. Cảm ơn.
Jogi

1
@RehanKhan Bắt đầu với .NET Framework v2.0, thời gian chạy sẽ chỉ tải các tập hợp được biên dịch với phiên bản .NET <= thời gian chạy hiện tại + .NET cũng lưu trữ các lần thử thất bại để tải các cụm + nếu một cuộc gọi trước đó đã được lắp ráp, thời gian chạy CL sẽ sử dụng lắp ráp đã được tải. Nói chung, tôi nghĩ tốt hơn là nói rằng họ đã giải quyết vấn đề bằng cách áp dụng các hạn chế rất nặng nề đối với những gì DLL mà chương trình chạy sẽ tải (trước khi nó từ bỏ và yêu cầu sự giúp đỡ của bạn).
Vladislav Martin

14

Giả sử bạn đang tạo một tệp thực thi sử dụng một số chức năng được tìm thấy trong thư viện.

Nếu thư viện bạn đang sử dụng là tĩnh , trình liên kết sẽ sao chép mã đối tượng cho các hàm này trực tiếp từ thư viện và chèn chúng vào tệp thực thi.

Bây giờ nếu chương trình thực thi này được chạy, nó có mọi thứ nó cần, vì vậy trình tải thực thi chỉ cần tải nó vào bộ nhớ và chạy nó.

Nếu thư viện là động , trình liên kết sẽ không chèn mã đối tượng mà thay vào đó, nó sẽ chèn một sơ khai mà về cơ bản cho biết chức năng này nằm trong DLL này tại vị trí này.

Bây giờ nếu thực thi này được chạy, các bit của tệp thực thi bị thiếu (tức là các sơ khai) để trình nạp đi qua thực thi sửa chữa các sơ khai bị thiếu. Chỉ sau khi tất cả các sơ khai đã được giải quyết, thì tệp thực thi mới được phép chạy.

Để thấy điều này trong hành động, hãy xóa hoặc đổi tên DLL và xem cách trình tải sẽ báo cáo lỗi DLL bị thiếu khi bạn cố chạy chương trình thực thi.

Do đó, tên Thư viện liên kết động , các phần của quá trình liên kết đang được thực hiện một cách linh hoạt trong thời gian chạy bởi trình tải thực thi.

Một lưu ý cuối cùng, nếu bạn không liên kết với DLL thì sẽ không có trình duyệt nào được chèn bởi trình liên kết, nhưng Windows vẫn cung cấp API GetProcAddress cho phép bạn tải điểm thực thi chức năng DLL lâu sau khi thực thi bắt đầu.


12

DLL (thư viện liên kết động) và SL (thư viện dùng chung, tương đương với UNIX) chỉ là các thư viện mã thực thi có thể được liên kết động thành một tệp thực thi khi tải.

Các thư viện tĩnh được chèn vào một tệp thực thi tại thời gian biên dịch và được cố định từ thời điểm đó. Chúng làm tăng kích thước của tệp thực thi và không thể chia sẻ.

Thư viện động có những ưu điểm sau:

1 / Chúng được tải vào thời gian chạy thay vì thời gian biên dịch để chúng có thể được cập nhật độc lập với tệp thực thi (tất cả các cửa sổ và hộp thoại ưa thích mà bạn thấy trong Windows đến từ DLL để giao diện của ứng dụng của bạn có thể thay đổi mà không cần bạn phải viết lại nó).

2 / Vì chúng độc lập, mã có thể được chia sẻ trên nhiều tệp thực thi - điều này giúp tiết kiệm bộ nhớ vì nếu bạn đang chạy 100 ứng dụng với một DLL duy nhất, có thể chỉ có một bản sao của DLL trong bộ nhớ.

Nhược điểm chính của chúng là lợi thế số 1 - việc DLL thay đổi độc lập ứng dụng của bạn có thể khiến ứng dụng của bạn ngừng hoạt động hoặc bắt đầu hành xử một cách kỳ quái. Phiên bản DLL có xu hướng không được quản lý tốt trong Windows và điều này dẫn đến "DLL Hell" có tên kỳ lạ.


11

Các tệp DLL chứa Bảng xuất là danh sách các ký hiệu có thể được tìm kiếm bởi chương trình gọi. Các biểu tượng thường là các hàm với quy ước gọi C ( __stcall ). Bảng xuất cũng chứa địa chỉ của hàm.

Với thông tin này, chương trình gọi sau đó có thể gọi các hàm trong DLL mặc dù nó không có quyền truy cập vào DLL tại thời điểm biên dịch.

Giới thiệu Thư viện liên kết động có thêm một số thông tin.


6

http://support.microsoft.com/kb/815065

DLL là một thư viện chứa mã và dữ liệu có thể được sử dụng bởi nhiều chương trình cùng một lúc. Ví dụ, trong các hệ điều hành Windows, Comdlg32 DLL thực hiện các chức năng liên quan đến hộp thoại chung. Do đó, mỗi chương trình có thể sử dụng chức năng có trong DLL này để thực hiện hộp thoại Mở. Điều này giúp thúc đẩy tái sử dụng mã và sử dụng bộ nhớ hiệu quả.

Bằng cách sử dụng DLL, một chương trình có thể được mô đun hóa thành các thành phần riêng biệt. Ví dụ, một chương trình kế toán có thể được bán theo mô-đun. Mỗi mô-đun có thể được tải vào chương trình chính trong thời gian chạy nếu mô-đun đó được cài đặt. Vì các mô-đun là riêng biệt, thời gian tải của chương trình nhanh hơn và mô-đun chỉ được tải khi chức năng đó được yêu cầu.

Ngoài ra, cập nhật dễ dàng hơn để áp dụng cho từng mô-đun mà không ảnh hưởng đến các phần khác của chương trình. Ví dụ: bạn có thể có chương trình trả lương và thuế suất thay đổi mỗi năm. Khi những thay đổi này được phân lập thành DLL, bạn có thể áp dụng bản cập nhật mà không cần phải xây dựng hoặc cài đặt lại toàn bộ chương trình.

http://en.wikipedia.org/wiki/Docate-link_l Library


2

DLL là một phần mở rộng tập tin và được biết đến như thư viện liên kết động của định dạng tập tin định dạng tập tin được sử dụng để giữ nhiều mã và thủ tục cho các chương trình Windows. Phần mềm & Trò chơi chạy trên cơ sở Tệp DLL; Các tệp DLL được tạo để nhiều ứng dụng có thể sử dụng thông tin của chúng cùng một lúc.

NẾU bạn muốn có thêm thông tin về Tệp DLL hoặc gặp bất kỳ lỗi nào, hãy đọc bài viết sau. https://www.bouncegeek.com/fix-dll-errors-windows-586985/


1

DLL (Thư viện liên kết động) chứa tài nguyên được sử dụng bởi một hoặc nhiều ứng dụng hoặc dịch vụ. Chúng có thể chứa các lớp, biểu tượng, chuỗi, đối tượng, giao diện và hầu hết mọi thứ mà nhà phát triển sẽ cần lưu trữ ngoại trừ UI.


3
Họ thực sự có thể lưu trữ một UI và một số chương trình làm điều này. Ví dụ: snap-in.
Brian R. Bondy

1

Theo Microsoft

(DLL) Thư viện liên kết động là các tệp chứa dữ liệu, mã hoặc tài nguyên cần thiết để chạy các ứng dụng. Đây là những tệp được tạo bởi hệ sinh thái windows và có thể được chia sẻ giữa hai hoặc nhiều ứng dụng.

Khi một chương trình hoặc phần mềm chạy trên Windows, phần lớn cách ứng dụng hoạt động phụ thuộc vào các tệp DLL của chương trình. Chẳng hạn, nếu một ứng dụng cụ thể có một vài mô-đun, thì cách mỗi mô-đun tương tác với nhau được xác định bởi các tệp Windows DLL.

Nếu bạn muốn giải thích chi tiết, hãy kiểm tra các tài nguyên hữu ích này

Tập tin dll là gì , về tập tin DLL

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.