Sự khác biệt giữa .dll và .exe?


91

Tôi muốn biết sự khác biệt chính xác giữa tệp dll và exe.


1
Bạn nên thêm một số bối cảnh ở đây: Bạn có phải là người mới bắt đầu Bạn đang tìm kiếm một một số loại đặc tả kỹ thuật sâu sắc về những thứ PE Hoặc cái gì khác
khebbie

3
Đúng là tôi là người mới bắt đầu. Nó là một câu hỏi phỏng vấn như được gắn thẻ.
Umesh Aawte,

Quan trọng hơn, đây là một bản sao bao gồm một bản (đã bị xóa) bởi sakthivignesh ...
Marc Gravell

Câu trả lời:


71

EXE:

  1. Đó là một tệp thực thi
  2. Khi tải một tệp thực thi, không có tệp xuất nào được gọi, mà chỉ có điểm nhập mô-đun.
  3. Khi một hệ thống khởi chạy tệp thực thi mới, một quy trình mới sẽ được tạo
  4. Luồng mục nhập được gọi trong ngữ cảnh của luồng chính của quá trình đó.

DLL:

  1. Đó là một Thư viện liên kết động
  2. Có nhiều biểu tượng được xuất.
  3. Hệ thống tải một DLL vào ngữ cảnh của một quy trình hiện có.

Để 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


9
Hệ thống tải một DLL vào một QUY TRÌNH hiện có, không phải luồng. Mọi DLL trong một quy trình đều có thể nhận được thông báo khi một luồng bắt đầu hoặc dừng, thông qua một LibMainhàm.
Daniel Earwicker,

13
Điểm 1 và 2 của bạn không đúng 100%. Vì bạn có thể sử dụng LoadLibraryEx trên exe hoặc dll có nghĩa là bạn có thể sử dụng GetProcAddress để tải một điểm nhập từ exe hoặc dll. Vì vậy, về mặt đó, cả hai tệp exe và dll có thể được liên kết động và có thể có bất kỳ số điểm nhập nào.
jussij

132

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

  1. Một exe luôn chạy trong không gian địa chỉ của chính nó, tức là, Nó là một quá trình riêng biệt.
  2. Mục đích của EXE là khởi chạy một ứng dụng riêng biệt của riêng nó.

DLL

  1. Một dll luôn cần một exe máy chủ để chạy. tức là, nó không bao giờ có thể chạy trong không gian địa chỉ của chính nó.
  2. Mục đích của DLL là có một tập hợp các phương thức / lớp có thể được sử dụng lại từ một số ứng dụng khác.
  3. DLL là cách triển khai thư viện dùng chung của Microsoft.

Đị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


4
Vì vậy, nếu bạn muốn bạn coudl đổi tên và chỉnh sửa tiêu đề của fikle để biến dll thành exe và ngược lại?
RCIX

@RCIX: Tôi nghi ngờ điều đó là có thể?
VoodooChild

Rất có thể là không thể - hãy xem câu trả lời của kichik bên dưới.
Jonathon Reinhart

31

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.


11
Đây là tải sai, nó ngụ ý rằng các tệp DLL không có điểm vào. DLL có thể có một điểm vào DllMain mà được gọi khi (trong số những thứ khác) các DLL được nạp vào quá trình
jay.lee

29

Có một vài khác biệt nữa về cấu trúc mà bạn có thể đề cập.

  1. Cả DLL và EXE đều chia sẻ cùng một cấu trúc tệp - Portable Executable hay PE. Để phân biệt giữa hai loại, người ta có thể nhìn vào Characteristicsthành phần IMAGE_FILE_HEADERbên trong IMAGE_NT_HEADERS. Đối với DLL, nó có IMAGE_FILE_DLLcờ (0x2000) được bật. Đối với EXE, đó là IMAGE_FILE_EXECUTABLE_IMAGEcờ (0x2).
  2. Tệp PE bao gồm một số tiêu đề và một số phần. Thường có một phần dành cho mã, một phần cho dữ liệu, một phần liệt kê các chức năng đã nhập và một phần cho tài nguyên. Một số phần có thể chứa nhiều hơn một thứ. Tiêu đề cũng mô tả một danh sách các thư mục dữ liệu nằm trong các phần. Những thư mục dữ liệu đó là thứ cho phép Windows tìm thấy những gì nó cần trong PE. Nhưng một loại thư mục dữ liệu mà EXE sẽ không bao giờ có (trừ khi bạn đang xây dựng một frankenstein EXE) là thư mục xuất. Đây là nơi các tệp DLL có danh sách các chức năng mà chúng xuất và có thể được sử dụng bởi các tệp EXE hoặc DLL khác. Ở phía bên kia, mỗi DLL và EXE có một thư mục nhập, nơi nó liệt kê các chức năng và tệp DLL mà nó yêu cầu để chạy.
  3. Ngoài ra trong tiêu đề PE ( IMAGE_OPTIONAL_HEADER) là ImageBasethà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 .


1
1. Vì đó là các cờ, cả hai đều có thể được đặt cùng một lúc. 2. Như bạn đã nói, nó có thể nhưng không thể biến mất. 3. ASLR cũng sẽ định vị lại exe, nếu nó có thể. Vì vậy, có, ngay cả một exe cũng có thể có các vị trí. Nói chung, EXE là DLL là có thể nhưng hiếm .
Deduplicator

20

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....


Trong thế giới phát triển .NET, khi bạn nhập mọi thứ từ các mô-đun khác, chẳng hạn như trong C # 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
Abdul

Bạn thường sử dụng từ khóa usingcho không gian tên, không phải lớp. Ngoại lệ dành cho using staticcó 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 usingtừ 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.
Darius

16

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.

tiêu đề

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.


3
Bạn nói "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)" --- Vậy điều đó có nghĩa là phần mở rộng có .exehay .dllkhô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 exevà đặ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?
Abdul

4

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ì đó.


3
+1: Vì vậy, ít người nhận ra rằng về mặt kỹ thuật, sự khác biệt chỉ là một chút trong tiêu đề PE
Serge Wautier

Tôi tự hỏi điều gì sẽ xảy ra trong một cuộc phỏng vấn nếu bạn trả lời như vậy. Them: "Sự khác biệt giữa DLL và EXE là gì?" Bạn: "Một chút".
JMI MADISON

4

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.


2

.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ớ.


2

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


1
Thời gian chạy .NET không liên quan gì đến .exe hoặc .dll, chúng là tệp mã máy nhị phân (Nếu chúng được tạo bằng một số ngôn ngữ lập trình đang sử dụng thời gian chạy .NET, thì thời gian chạy .NET có liên quan, nhưng đó đã là trách nhiệm của mã exe, không phải trình tải hệ điều hành).
Ped7g, 24/08/2016

1

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.


6
Ai đó có thể cảm thấy rằng câu trả lời của bạn không đủ chi tiết.
JesperE

yea, mọi người có thể không biết chương trình thực thi là gì, và bản thân nó trở thành một câu hỏi hoàn toàn mới.
Mindless

1

● .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ó.


0

Sự khác biệt trong DLL và EXE:

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.


-1

Vui lòng bình luận trong khi phản đối.

Đố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


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.