Tôi muốn biết sự khác biệt chính xác giữa tệp dll và exe.
Tôi muốn biết sự khác biệt chính xác giữa tệp dll và exe.
Câu trả lời:
EXE:
DLL:
Để biết thêm chi tiết: http://www.c-sharpcorner.com/Interviews/Answer/Answers.aspxQuestionId=1431&MajorCategoryId=1&MinorCategoryId=1 http://wiki.answers.com/Q/What_is_the_difference_between_an_EXE_and_a_DLL
Tham khảo: http://www.dotnetspider.com/forum/34260-What-difference-between-dll-exe.aspx
LibMain
hàm.
Tôi không biết tại sao mọi người trả lời câu hỏi này trong ngữ cảnh của .NET. Câu hỏi là một câu hỏi chung chung và không đề cập đến .NET ở bất cứ đâu.
Chà, sự khác biệt chính là:
EXE
DLL
Định dạng tệp của DLL và exe về cơ bản là giống nhau. Windows nhận ra sự khác biệt giữa DLL và EXE thông qua PE Header trong tệp. Để biết chi tiết về PE Header, bạn có thể xem Bài viết này trên MSDN
Sự khác biệt là EXE có một điểm vào, một phương thức "chính" sẽ chạy khi thực thi.
Mã trong một DLL cần được gọi từ một ứng dụng khác.
Có một vài khác biệt nữa về cấu trúc mà bạn có thể đề cập.
Characteristics
thành phần IMAGE_FILE_HEADER
bên trong IMAGE_NT_HEADERS
. Đối với DLL, nó có IMAGE_FILE_DLL
cờ (0x2000) được bật. Đối với EXE, đó là IMAGE_FILE_EXECUTABLE_IMAGE
cờ (0x2).IMAGE_OPTIONAL_HEADER
) là ImageBase
thành viên. Nó chỉ định địa chỉ ảo mà PE giả định rằng nó sẽ được tải. Nếu nó được tải ở một địa chỉ khác, một số con trỏ có thể trỏ đến bộ nhớ sai. Vì các tệp EXE nằm trong số những tệp đầu tiên được tải vào không gian địa chỉ mới của chúng, trình tải Windows có thể đảm bảo một địa chỉ tải liên tục và đó thường là 0x00400000. Sự sang trọng đó không tồn tại đối với một DLL. Hai tệp DLL được tải vào cùng một quy trình có thể yêu cầu cùng một địa chỉ. Đây là lý do tại sao một DLL có một thư mục dữ liệu khác được gọi là Base Relocation Directory thường nằm trong phần riêng của nó - .reloc
. Thư mục này chứa danh sách các vị trí trong DLL cần được phục hồi / vá để chúng sẽ trỏ đến đúng bộ nhớ. Hầu hết các tệp EXE không có thư mục này, nhưng một số trình biên dịch cũ tạo ra chúng.Bạn có thể đọc thêm về chủ đề này @ MSDN .
Câu trả lời này chi tiết hơn tôi nghĩ một chút nhưng hãy đọc kỹ.
DLL:
Trong hầu hết các trường hợp, tệp DLL là một thư viện . Có một số loại thư viện, động và tĩnh - hãy đọc về sự khác biệt . DLL là viết tắt của thư viện liên kết động cho chúng ta biết rằng nó là một phần của chương trình nhưng không phải toàn bộ. Nó được làm bằng các thành phần phần mềm có thể tái sử dụng ( thư viện ) mà bạn có thể sử dụng cho nhiều chương trình . Hãy nhớ rằng luôn có thể sử dụng mã nguồn thư viện trong nhiều ứng dụng bằng cách sử dụng sao chép-dán, nhưng ý tưởng của Thư viện DLL / Tĩnh là bạn có thể cập nhật mã của thư viện và đồng thời cập nhật tất cả các ứng dụng đang sử dụng nó - mà không cần biên dịch.
Ví dụ:
Hãy tưởng tượng bạn đang tạo một thành phần Windows GUI giống như một Nút . Trong hầu hết các trường hợp, bạn muốn sử dụng lại mã bạn đã viết vì nó phức tạp nhưng thành phần phổ biến - Bạn muốn nhiều ứng dụng sử dụng nó nhưng bạn không muốn cung cấp cho chúng mã nguồn Bạn không thể sao chép -paste mã cho nút trong mọi chương trình, vì vậy bạn quyết định bạn muốn tạo một DL-Thư viện (DLL) .
Điều này "nút" thư viện được yêu cầu của EXE cutables để chạy, và không có nó họ sẽ không chạy vì họ không biết làm thế nào để tạo ra các nút, chỉ có cách nói chuyện với nó.
Tương tự như vậy, một DLL không thể được thực thi - chạy, bởi vì nó chỉ là một phần của chương trình nhưng không có thông tin cần thiết để tạo một "tiến trình" .
EXE:
Một tệp thực thi là chương trình . Nó biết cách tạo một quy trình và cách nói chuyện với DLL. Nó cần DLL để tạo một nút và nếu không có nó, ứng dụng sẽ không chạy - LỖI.
hi vọng điêu nay co ich....
using SomeClassFromALibrary
, thư viện đó được liên kết với dự án thông qua DLL? Chỉ đang cố gắng xem liệu tôi có hiểu đúng hay không
using
cho không gian tên, không phải lớp. Ngoại lệ dành cho using static
có sẵn từ c # 6, nhập tất cả các thành viên tĩnh có trong lớp được chỉ định ( liên kết ). Các using
từ khóa đưa ra một lời hứa để trình biên dịch rằng trong thời gian chạy sẽ có một thư viện có chứa namespace . Thư viện không được liên kết với dự án thông qua DLL đó, DLL là thư viện được liên kết với dự án (assembly). DLL đó chứa tất cả mã đã được hứa trong thời gian biên dịch.
Cả DLL và EXE đều định dạng thực thi di động (PE)
Một dll (DLL) là một thư viện và do đó không thể được thực hiện trực tiếp. Nếu bạn cố gắng chạy nó, bạn sẽ gặp lỗi về việc thiếu điểm nhập. Nó cần một điểm vào (chức năng chính) để được thực thi, điểm vào đó có thể là bất kỳ ứng dụng nào hoặc exe. Liên kết DLL xảy ra tại thời điểm chạy. Đó là lý do tại sao nó được gọi là thư viện "Liên kết động".
Một thực thi (EXE) là một chương trình có thể được thực thi. Nó có điểm vào riêng của nó. Một cờ bên trong tiêu đề PE cho biết đó là loại tệp nào (không liên quan đến phần mở rộng tệp). Tiêu đề PE có một trường chứa điểm vào chương trình. Trong các DLL, nó không được sử dụng (hoặc ít nhất không phải là một điểm vào).
Có nhiều phần mềm có sẵn để kiểm tra thông tin tiêu đề. Sự khác biệt duy nhất khiến cả hai hoạt động khác nhau là bit trong tiêu đề như được hiển thị trong sơ đồ dưới đây.
Tệp EXE chỉ có một mục nhập chính duy nhất có nghĩa là nó là ứng dụng bị cô lập, khi hệ thống khởi chạy exe, một quy trình mới sẽ được tạo trong khi các tệp DLL có nhiều điểm nhập nên khi ứng dụng sử dụng không có quy trình mới bắt đầu, DLL có thể được sử dụng lại và tạo phiên bản. DLL làm giảm không gian lưu trữ vì các chương trình khác nhau có thể sử dụng cùng một dll.
.exe
hay .dll
không quan trọng? Đó là lá cờ trong tiêu đề thực sự phân biệt chúng .... Vì vậy, nếu tôi tạo exe
và đặt tên nó thông qua tương tác GUI dưới dạng một .dll
, nhưng sau đó thay đổi cờ đó theo cách thủ công, nó vẫn có thể chạy được?
Hai thứ: phần mở rộng và cờ tiêu đề được lưu trữ trong tệp.
Cả hai tệp đều là tệp PE. Cả hai đều có cùng một bố cục. DLL là một thư viện và do đó không thể được thực thi. Nếu bạn cố gắng chạy nó, bạn sẽ gặp lỗi về điểm nhập bị thiếu. EXE là một chương trình có thể được thực thi. Nó có một điểm vào. Một cờ bên trong tiêu đề PE cho biết đó là loại tệp nào (không liên quan đến phần mở rộng tệp). Tiêu đề PE có một trường chứa điểm vào chương trình. Trong các DLL, nó không được sử dụng (hoặc ít nhất không phải là một điểm vào).
Một điểm khác biệt nhỏ là trong hầu hết các trường hợp, các tệp DLL có một phần xuất, nơi các ký hiệu được xuất. EXE không bao giờ nên có phần xuất vì chúng không phải là thư viện nhưng không có gì ngăn cản điều đó xảy ra. Trình tải Win32 cũng không quan tâm.
Chỉ khác là chúng giống hệt nhau. Vì vậy, tóm lại, EXE là chương trình thực thi trong khi DLL là thư viện được tải vào một quy trình và chứa một số loại chức năng hữu ích như bảo mật, truy cập cơ sở dữ liệu hoặc thứ gì đó.
Dll v / s Exe
1) Tệp DLL là một thư viện liên kết động có thể được sử dụng trong các tệp exe và các tệp dll khác.
Tệp EXE là một tệp thực thi chạy trong một quy trình riêng biệt được hệ điều hành quản lý.
2) Các tệp DLL không thể thực thi trực tiếp. Chúng là các tệp riêng biệt chứa các hàm có thể được gọi bởi các chương trình và các tệp DLL khác để thực hiện các tính toán và chức năng.
EXE là một chương trình có thể được thực thi. Ví dụ: chương trình Windows
3)
DLL tái sử dụng: Chúng có thể được sử dụng lại cho một số ứng dụng khác. Miễn là người viết mã biết tên và tham số của các hàm và thủ tục trong tệp DLL.
EXE: Chỉ dành cho mục đích cụ thể.
4) Một DLL sẽ chia sẻ cùng một quy trình và không gian bộ nhớ của ứng dụng gọi trong khi
EXE tạo ra quy trình và không gian bộ nhớ riêng biệt.
5) Sử dụng
DLL: Bạn muốn nhiều ứng dụng sử dụng nó nhưng bạn không muốn cung cấp mã nguồn cho chúng. Bạn không thể sao chép-dán mã cho nút trong mọi chương trình, vì vậy bạn quyết định muốn tạo một DL- Thư viện (DLL).
EXE: Khi chúng tôi làm việc với các mẫu dự án như Ứng dụng Biểu mẫu Windows, Ứng dụng Bảng điều khiển, Ứng dụng WPF và Dịch vụ Windows, chúng sẽ tạo ra một hợp ngữ exe khi được biên dịch.
6) Điểm giống nhau:
Cả DLL và EXE đều là các tệp nhị phân có cấu trúc lồng nhau phức tạp được xác định bởi định dạng Portable Executable và chúng không nhằm mục đích chỉnh sửa bởi người dùng.
.Exe là chương trình. .Dll là một thư viện mà .exe (hoặc .dll khác) có thể gọi vào.
Những gì sakthivignesh nói có thể đúng ở chỗ một .exe có thể sử dụng .exe khác như thể nó là một thư viện và điều này được thực hiện (ví dụ) với một số thành phần COM. Trong trường hợp này, "nô lệ" .exe là một chương trình riêng biệt (nói đúng ra là một quá trình riêng biệt - có thể chạy trên một máy riêng biệt), nhưng là một chương trình chấp nhận và xử lý các yêu cầu từ các chương trình / thành phần / bất cứ thứ gì khác.
Tuy nhiên, nếu bạn chỉ chọn một tệp .exe và .dll ngẫu nhiên từ một thư mục trong Tệp chương trình của mình, thì rất có thể COM không liên quan - chúng chỉ là một chương trình và các thư viện được liên kết động của nó.
Sử dụng các API Win32, một chương trình có thể tải và sử dụng DLL bằng các hàm API LoadLibrary và GetProcAddress, IIRC. Có những chức năng tương tự trong Win16.
Về nhiều mặt, COM là sự phát triển của ý tưởng DLL, ban đầu được coi là nền tảng cho OLE2, trong khi .NET là hậu duệ của COM. DLL đã có từ Windows 1, IIRC. Ban đầu chúng là một cách chia sẻ mã nhị phân (đặc biệt là các API hệ thống) giữa nhiều chương trình đang chạy để giảm thiểu việc sử dụng bộ nhớ.
EXE hiển thị với hệ thống dưới dạng tệp thực thi Win32 thông thường. Điểm vào của nó đề cập đến một bộ tải nhỏ khởi tạo thời gian chạy .NET và yêu cầu nó tải và thực thi hợp ngữ có trong EXE. Một DLL hiển thị với hệ thống dưới dạng Win32 DLL nhưng rất có thể không có bất kỳ điểm nhập nào. Thời gian chạy .NET lưu trữ thông tin về assembly chứa trong tiêu đề của chính nó.
dll là tập hợp các hàm có thể sử dụng lại trong đó .exe là một tệp thực thi có thể gọi các hàm này
Exe là một chương trình thực thi trong khi A DLL là một tệp có thể được tải và thực thi bởi các chương trình động.
● .exe và dll là phiên bản đã biên dịch của mã c #, còn được gọi là hội đồng.
● .exe là một tệp thực thi độc lập, có nghĩa là nó có thể thực thi trực tiếp.
● .dll là một thành phần có thể sử dụng lại không thể được thực thi trực tiếp và nó yêu cầu các chương trình khác thực thi nó.
1) DLL là một thành phần trong quá trình có nghĩa là chạy trong cùng một không gian bộ nhớ với tiến trình khách. EXE là một Out-Process Component có nghĩa là nó chạy trong không gian bộ nhớ riêng biệt.
2) DLL chứa các hàm và thủ tục mà các chương trình khác có thể sử dụng (thúc đẩy khả năng tái hợp) trong khi EXE không thể được chia sẻ với các chương trình khác.
3) DLL không thể được thực thi trực tiếp vì chúng được thiết kế để tải và chạy bởi các chương trình khác. EXE là một chương trình được thực thi trực tiếp.
Đối với những người đang tìm kiếm một câu trả lời ngắn gọn,
Nếu một hợp ngữ được biên dịch dưới dạng thư viện lớp và cung cấp các kiểu cho các hợp ngữ khác sử dụng, thì nó có phần mở rộng ifle
.dll
(thư viện liên kết động) và nó không thể được thực thi độc lập.Tương tự như vậy, nếu một assembly được biên dịch dưới dạng ứng dụng, thì nó có phần mở rộng tệp
.exe
(có thể thực thi) và có thể được thực thi độc lập. Trước .NET Core 3.0, các ứng dụng bảng điều khiển đã được biên dịch thành .dll Meat và phải được thực thi bằng lệnh chạy dotnet hoặc tệp thực thi trên máy chủ. - Nguồn
Sự khác biệt chính xác chính giữa DLL và EXE là DLL không có điểm vào và EXE thì có. Nếu bạn đã quen với c ++, bạn có thể thấy rằng build EXE có hàm entry main () còn DLL thì không :)