2009-07-31 38 views
71

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

+1

Bạn nên thêm một số ngữ cảnh tại đây: Bạn có phải là người mới bắt đầu Bạn đang tìm kiếm một số đặc điểm kỹ thuật sâu của công cụ PE Hoặc cái gì khác – khebbie

+0

Đúng là tôi mới bắt đầu. Đó là một câu hỏi phỏng vấn được gắn thẻ. –

+0

Tôi nghĩ tất cả các câu trả lời đều tốt và mang tính thông tin. Tôi sẽ kiểm tra điều này bao giờ hết để biết thêm, Cảm ơn. –

Trả lời

58

EXE:

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

DLL:

  1. Đó là một Dynamic Link Library
  2. Có nhiều biểu tượng xuất khẩu.
  3. Hệ thống tải một DLL vào ngữ cảnh của một quá 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

+7

Trên thực tế, chỉ có một Entry point trong một DLL nếu nó là một DLL không được quản lý. Câu hỏi không phải là IMO cụ thể. – Aamir

+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 quá trình có thể nhận được một thông báo khi một thread bắt đầu hoặc dừng lại, thông qua một hàm 'LibMain'. –

+11

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

1

Một exe là một chương trình thực thi trong khi DLL là một tệp có thể được tải và thực thi theo chương trình động.

+0

Tại sao người nào đó lại tiêu cực? Tôi sẽ đánh giá cao nếu tôi biết lý do cũng như nếu không thì điểm bỏ phiếu là gì? –

+4

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

+0

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

2

Một EXE hiển thị với hệ thống dưới dạng tệp thực thi Win32 thông thường. Mục nhập của nó trỏ đế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 hiện lắp ráp có trong EXE. Một DLL có thể nhìn thấy hệ thống như là một DLL Win32 nhưng rất có thể không có bất kỳ điểm nhập cảnh nào. Thời gian chạy .NET lưu trữ thông tin về việc lắp ráp chứa trong tiêu đề của chính nó.

dll là một tập hợp các thể tái sử dụng chức năng nơi như một .exe là một thực thi mà có thể gọi những chức năng

+0

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

-1

Sự khác biệt chính xác lớn giữa DLL và EXE rằng DLL đã không có một điểm vào và EXE không. Nếu bạn đã quen với C++, bạn có thể thấy rằng build EXE có hàm main() và DLL không :)

+0

Đừng nghĩ vậy. Hãy xem tại đây http://msdn.microsoft.com/en-us/library/ms682596(VS.85).aspx – Aamir

100

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 .NET. Câu hỏi là một câu hỏi chung và không đề cập đến .NET ở bất cứ đâu.

Vâng, sự khác biệt chính là:

EXE

  1. Một exe luôn chạy trong không gian địa chỉ riêng của mình ví dụ: Đó 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 của riêng mình.

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 tệp DLL là có một tập hợp các phương thức/lớp học có thể được sử dụng lại từ một số ứng dụng khác.
  3. DLL là triển khai của Microsoft về một thư viện được chia sẻ.

Định dạng tệp của DLL và exe về cơ bản 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 tin. Để biết chi tiết về PE Header, You can have a look at this Article on MSDN

+3

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

+0

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

+0

Rất có thể là không thể - xem [câu trả lời của kichik] (http://stackoverflow.com/a/4266184/119527) bên dưới. –

16

Câu trả lời này chi tiết hơn một chút so với tôi nghĩ nhưng đọc qua.

DLL:
Trong hầu hết các trường hợp, một tập tin DLL là một thư viện. Có một vài loại thư viện, động và tĩnh - read about the difference. DLL là viết tắt của dynamic link library cho chúng tôi biết rằng đó là một phần của chương trình nhưng không phải là toàn bộ điều. Nó được làm bằng các thành phần phần mềm có thể tái sử dụng (library) mà bạn có thể sử dụng cho nhiều hơn một chương trình đơn lẻ. 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 copy-paste, nhưng ý tưởng về một thư viện DLL/Static là bạn có thể cập nhật mã của một thư viện và đồng thời cập nhật tất cả các ứng dụng bằng nó - mà không biên dịch.

Ví dụ:
Hãy tưởng tượng bạn đang tạo một Windows GUI component 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 là một thành phần phổ biế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 họ mã nguồn Bạn có thể ' t sao chép-dán 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-Library (DLL).

"nút" Thư viện này là 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, không thể thực thi DLL - chạy, vì nó chỉ là một phần của chương trình nhưng không có thông tin bắt buộc để tạo "process".

EXE:
Một thực thi là chương trình. Nó biết cách tạo một process và cách nói chuyện với DLL. Yêu cầu cần DLL để tạo nút và không có ứng dụng không chạy - L ERI.

hy vọng điều này sẽ giúp ....

+0

Trong.NET thế giới phát triển, khi bạn đang nhập khẩu từ các mô-đun khác, ví dụ, trong C# 'bằng cách sử dụng SomeClassFromALibrary', thư viện đó được liên kết với dự án thông qua một DLL? Chỉ cần cố gắng để xem nếu tôi hiểu chính xác – Abdul

20

Sự khác biệt là EXE có điểm vào, phương thức "chính" sẽ chạy trên thực thi.

Mã trong một DLL cần phải được gọi từ một ứng dụng khác.

+5

Câu trả lời đơn giản .. !! – pvaju896

+7

Đây là tải trọng, 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 được gọi khi (trong số những thứ khác) DLL được nạp vào quá trình –

1

.exe là chương trình. Dll là một thư viện mà .exe (hoặc một .dll khác) có thể gọi vào.

Những gì sakthivignesh nói có thể đúng trong một .exe có thể sử dụng 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, exe "nô lệ" là một chương trình riêng biệt (nói đúng, một quá trình riêng biệt - có thể chạy trên một máy riêng), nhưng nó chấp nhận và xử lý các yêu cầu từ các chương trình/thành phần khác/bất cứ điều gì. Tuy nhiên, nếu bạn chỉ chọn ngẫu nhiên .exe và .dll từ một thư mục trong Tệp Chương trình của bạn, tỷ lệ cược là COM không có 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 API Win32, chương trình có thể tải và sử dụng DLL bằng cách sử dụng hàm API LoadLibrary và GetProcAddress, IIRC. Có những chức năng tương tự trong Win16.

COM theo nhiều cách là sự tiến hóa của ý tưởng DLL, ban đầu được coi là cơ sở cho OLE2, trong khi .NET là hậu duệ của COM. DLL đã được khoảng 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ớ.

20

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

  1. Cả hai tệp DLL và EXE đều có cùng cấu trúc tệp - Portable Executable hoặc PE. Để phân biệt giữa hai người, người ta có thể tìm kiếm thành viên Characteristics của IMAGE_FILE_HEADER bên trong IMAGE_NT_HEADERS. Đối với một DLL, nó có cờ IMAGE_FILE_DLL (0x2000) được bật. Đối với EXE, đó là cờ IMAGE_FILE_EXECUTABLE_IMAGE (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 cho mã, một phần cho dữ liệu, một phần liệt kê các hàm đã nhập và một phần cho tài nguyên. Một số phần có thể chứa nhiều thứ. Tiêu đề cũng 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à những gì 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à một 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 khẩu. Đây là nơi các tệp DLL có một danh sách các hàm 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 khẩu, trong đó nó liệt kê các hàm và các tệp DLL mà nó yêu cầu để chạy.
  3. Cũng trong tiêu đề PE (IMAGE_OPTIONAL_HEADER) là thành viên ImageBase. Nó chỉ định địa chỉ ảo mà PE giả định nó sẽ được tải. Nếu nó được tải 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 nạp 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 cho một DLL. Hai tệp DLL được nạp 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 địa điểm trong DLL cần được rebased/patched để chúng trỏ đến bộ nhớ phù hợp. 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.

3

Hai điều: tiện ích 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 chứa cùng một bố cục chính xác. Một DLL là một thư viện và do đó không thể được thực hiện. Nếu bạn cố gắng chạy nó, bạn sẽ nhận được một lỗi về một điểm vào 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 lá cờ bên trong tiêu đề PE cho biết loại tệp đó là gì (không liên quan đến phần mở rộng tệp). Tiêu đề PE có một trường có điểm vào cho chương trình. Trong các tệp 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 khác biệt nhỏ là trong hầu hết các trường hợp, DLLs có phần xuất nơi biểu tượng được xuất. EXE không bao giờ nên có một phần xuất khẩu 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 xuống Win32 không quan tâm theo cách nào.

Khác với chúng giống hệt nhau. Vì vậy, tóm lại, EXE là các chương trình thực thi trong khi các DLL là các thư viện được nạp vào một tiến trình và chứa một số chức năng hữu ích như bảo mật, truy cập cơ sở dữ liệu hoặc một cái gì đó.

+2

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

10

Cả DLL và EXE là Portable Executable(PE) Formats

Một Dynamic-link library (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ẽ nhận được một lỗi về một điểm vào bị thiếu. 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 hoặc exe nào. DLL ràng buộc xảy ra tại thời gian chạy. Đó là lý do tại sao nó được gọi là thư viện "Dynamic Link".

An Executable (EXE) là chương trình có thể được thực thi. Nó có điểm vào riêng. Một lá cờ bên trong tiêu đề PE cho biết 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 có điểm vào cho chương trình. Trong các tệp 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ó rất nhiều software 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ư trong sơ đồ dưới đây.

header

tập tin EXE có nhập chính chỉ đơn có nghĩa là nó là ứng dụng độc lập, khi một hệ thống ra mắt exe, một quá trình mới được tạo ra trong khi DLL có nhiều điểm vào nên khi ứng dụng sử dụng nó không mới quá trình bắt đầu, DLL có thể được tái sử dụng và phiên bản. DLL làm giảm không gian lưu trữ như các chương trình khác nhau có thể sử dụng cùng một dll. Exe

1) tập tin DLL

+1

Bạn nói "Một lá cờ bên trong tiêu đề PE cho biết 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 là' .exe' hoặc '.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 một 'exe' và đặt tên nó thông qua giao diện GUI dưới dạng' .dll', nhưng sau đó thay đổi cờ đó theo cách thủ công, nó vẫn chạy được? – Abdul

2

DLL v/s là một thư viện liên kết động mà có thể được sử dụng trong các tập tin exe và file dll khác.
Tệp EXE là tệp thực thi chạy trong quy trình riêng biệt được quản lý bởi hệ điều hành.

2) 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 các chương trình và các DLL khác gọi để thực hiện 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) Khả năng tái sử dụng
DLL: Chúng có thể được sử dụng lại cho một số ứng dụng khác.Miễn là coder biết tên và tham số của các hàm và thủ tục trong tệp DLL.
EXE: Chỉ cho mục đích cụ thể.

4) DLL sẽ chia sẻ cùng một quy trình và không gian bộ nhớ của ứng dụng gọi điện trong khi
EXE tạo không gian bộ nhớ và quy trình riêng.

5) Sử dụng
DLL: Bạn muốn nhiều ứng dụng sử dụng nhưng không muốn cung cấp mã nguồn Bạn không thể sao chép mã cho nút trong mọi chương trình, do đó bạn quyết định muốn tạo một thư viện DL (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 tạo ra một assembly exe khi biên dịch.

6) Điểm tương đồng:
Cả hai tệp DLL và EXE là tệp nhị phân có cấu trúc lồng nhau phức tạp được định nghĩa theo định dạng Di động và không được người dùng chỉnh sửa.

-1

● .exe và dll là phiên bản được biên dịch của mã C# cũng được gọi là hội đồng.

● .exe là tệp thực thi độc lập, có nghĩa là tệp có thể được thực thi trực tiếp.

● .dll là thành phần có thể sử dụng lại không thể thực thi trực tiếp và yêu cầu các chương trình khác để thực thi nó.

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