2008-09-23 47 views

Trả lời

209

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 được. Chúng tương tự như các tệp .so trong Linux/Unix. Đó là để nói, DLL là MS thực hiện các thư viện được chia sẻ.

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

DLL chứa gì?

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

loại hình thư viện:

On 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ửa sổ các phần mở rộng tập tin như sau: Thư viện tĩnh (.lib) và thư viện động (.dll). 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 khi chạy.

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

Bạn không thường thấy các thư viện tĩnh mặc dù trên máy tính của bạn, bởi vì một thư viện tĩnh được nhúng trực tiếp bên trong của một module (EXE hoặc DLL). Thư viện động là một tệp độ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 tệp DLL một cách rõ ràng. Một thư viện tĩnh không thể thay đổi khi nó đượ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 bản thân EXE.

tải một DLL:

Một chương trình nạp một DLL lúc khởi động, thông qua Win32 API LoadLibrary, hoặc khi nó là một sự phụ thuộc của DLL khác. Một chương trình sử dụng GetProcAddress để tải một hàm hoặc LoadResource để tải một 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.

+2

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

+2

Cảm ơn adam bình luận, sửa chữa nhiều nhất. –

+1

Đã xóa những địa chỉ dường như được giải quyết. Làm thế nào để tôi có được điểm cho điều này?

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à khá nhiều thứ mà nhà phát triển cần lưu trữ ngoại trừ giao diện người dùng.

+2

Họ thực sự có thể lưu trữ một giao diện người dùng và một số chương trình thực hiện việc này. Ví dụ: các snap-in. –

4

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

Một DLL là một thư viện có chứa mã và dữ liệu có thể được sử dụng bởi hơn một chương trình cùng một lúc. Ví dụ: , trong hệ điều hành Windows, DLL Comdlg32 thực hiện các chức năng liên quan phổ biến hộp thoại. Vì vậy, mỗi chương trình có thể sử dụng chức năng được chứa trong DLL này để triển khai hộp thoại Mở . Điều này giúp tăng cường sử dụng lại 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ể là được mô đun hóa thành các thành phần riêng biệt. Ví dụ: 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 khi chạy thời gian nếu mô-đun đó được cài đặt. Vì các mô đun 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. Đối với ví dụ , bạn có thể có một bảng lương chương trình và thuế suất thay đổi mỗi năm. Khi những thay đổi này bị cô lập thành một 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/Dynamic-link_library

8

file DLL chứa một Xuất bảng mà là một danh sách các biểu tượng có thể được nhìn lên bởi các chương trình gọi điện thoại. Các ký hiệu thường có chức năng với C calling convention (__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 điện sau đó có thể gọi các hàm trong DLL ngay cả khi nó không có quyền truy cập vào DLL tại thời gian biên dịch.

Introducing Dynamic Link Libraries có thêm một số thông tin.

6

DLLs (thư viện liên kết động) và SLs (thư viện được chia sẻ, tương đương dưới UNIX) chỉ là thư viện của mã thực thi có thể được liên kết động vào tệp thực thi tại thời gian tải.

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

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

1/Họ được nạp vào thời gian chạy chứ không phải biên dịch thời gian để họ có thể được cập nhật một cách độc lập của các thực thi (tất cả những cửa sổ lạ mắt và hộp thoại mà bạn nhìn thấy trong Windows đến từ Các tệp DLL để giao diện của ứng dụng của bạn có thể thay đổi mà không cầ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 thi hành - điều này 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, chỉ có thể có một bản sao của tệp DLL trong bộ nhớ.

Bất lợi chính của chúng là lợi thế # 1 - 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 hoạt động một cách kỳ lạ. Phiên bản DLL có xu hướng không được quản lý rất tốt trong Windows và điều này dẫn đến tên "DLL Hell" có tên kỳ lạ.

9

Giả sử bạn đang tạo một tệp thực thi có 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à static, trình liên kết sẽ sao chép mã đối tượng cho các chức năng 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 tệp thực thi này chạy nó có mọi thứ cần thiết, vì vậy trình tải thực thi chỉ tải nó vào bộ nhớ và chạy nó.

Nếu thư viện là động các mối liên kết sẽ không chèn mã đối tượng mà nó sẽ chèn một mẩu mà về cơ bản nói chức năng này nằm ở này DLL tại địa điểm này.

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

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

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 tự động vào 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 đến tệp DLL thì sẽ không đượ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 một điểm thực thi hàm DLL dài sau khi thực thi đã bắt đầu.

31

DLL là gì?

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

Chúng có quan trọng không?

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

file DLL có thể yêu cầu các file DLL khác

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

Có rất nhiều trong số họ 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 sử dụng dưới dạng các tập tin DLL như họ là một mẫu mã chia sẻ/nguồn lực. Mỗi chức năng được lưu giữ riêng biệt trong các tệp DLL khác nhau sao cho chỉ các tệp DLL được yêu cầu mới được tải và do đó làm giảm các hạn chế về bộ nhớ trên hệ thống.

các ứng dụng đã cài đặt cũng sử dụng các file DLL

DLL file cũng trở thành một hình thức tách chức năng thể chất như đã 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 DLL cho đến khi chúng được yêu cầu hoàn toàn, làm giảm các yêu cầu bộ nhớ. Điều này cũng gây ra các ứng dụng để gửi với rất nhiều tập tin DLL.

DLL Hell

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

Làm cách nào để biết nội dung trong tệp DLL?

Bạn phải sử dụng công cụ bên ngoài như DUMPBIN hoặc Dependency Walker 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) được chứa bên trong tệp DLL và các tệp DLL khác cần và xuất Các tệp DLL tệp DLL này phụ thuộc vào.

Làm cách nào để 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++, tham khảo LoadLibrary trong MSDN.

+1

Vui lòng hoàn thành câu này ('" Nền tảng .NET có thể không gặp phải vấn đề này. "') Với lý do tại sao. Cảm ơn. – Jogi

+0

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

2

DLL là một phần mở rộng tệp & Được gọi là định dạng tệp “thư viện liên kết động” đượ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 nền tảng của các 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 nhận thêm thông tin về tệp DLL hoặc gặp phải bất kỳ lỗi nào, hãy đọc bài đăng sau. https://www.bouncegeek.com/fix-dll-errors-windows-586985/

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