我想知道 dll 和 exe 文件之间的确切区别。
15 回答
我不知道为什么每个人都在 .NET 的上下文中回答这个问题。这个问题是一个笼统的问题,并没有在任何地方提到 .NET。
嗯,主要区别是:
EXE文件
- exe 始终在其自己的地址空间中运行,即,它是一个单独的进程。
- EXE 的目的是启动它自己的单独应用程序。
动态链接库
- dll 始终需要主机 exe 才能运行。即,它永远不能在自己的地址空间中运行。
- DLL 的目的是拥有一组可以从其他应用程序中重用的方法/类。
- DLL 是微软对共享库的实现。
DLL和exe的文件格式本质上是一样的。Windows 通过文件中的 PE Header 来识别 DLL 和 EXE 之间的区别。PE Header的详细介绍,可以看MSDN上的这篇文章
EXE文件:
- 这是一个可执行文件
- 加载可执行文件时,不会调用导出,而只会调用模块入口点。
- 当系统启动新的可执行文件时,会创建一个新进程
- 在该进程的主线程的上下文中调用入口线程。
动态链接库:
- 这是一个动态链接库
- 有多个导出符号。
- 系统将 DLL 加载到现有进程的上下文中。
更多详情: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
参考: http: //www.dotnetspider.com/forum/34260-What-difference-between-dll-exe.aspx
不同之处在于 EXE 有一个入口点,一个将在执行时运行的“主”方法。
DLL 中的代码需要从另一个应用程序中调用。
关于您可以提到的结构,还有一些不同之处。
- DLL 和 EXE 共享相同的文件结构 - 可移植可执行文件或 PE。要区分两者,可以查看inside的
Characteristics
成员。对于 DLL,它打开了 (0x2000) 标志。对于 EXE,它是(0x2) 标志。IMAGE_FILE_HEADER
IMAGE_NT_HEADERS
IMAGE_FILE_DLL
IMAGE_FILE_EXECUTABLE_IMAGE
- PE 文件由一些标题和一些节组成。通常有一个代码部分,一个数据部分,一个列出导入函数的部分和一个资源部分。有些部分可能包含不止一件事。标题还描述了位于各节中的数据目录列表。这些数据目录使 Windows 能够在 PE 中找到它需要的内容。但是 EXE 永远不会拥有的一种数据目录(除非您正在构建 frankenstein EXE)是导出目录。这是 DLL 文件具有它们导出的函数列表并且可以被其他 EXE 或 DLL 文件使用的地方。另一方面,每个 DLL 和 EXE 都有一个导入目录,其中列出了运行所需的函数和 DLL 文件。
- 在 PE 标头 (
IMAGE_OPTIONAL_HEADER
) 中也是ImageBase
成员。它指定了 PE 假定它将被加载的虚拟地址。如果它被加载到另一个地址,一些指针可能指向错误的内存。由于 EXE 文件是最先被加载到新地址空间的文件之一,Windows 加载程序可以确保加载地址恒定,通常为 0x00400000。DLL 不存在这种奢侈。加载到同一个进程中的两个 DLL 文件可以请求同一个地址。这就是为什么 DLL 有另一个称为基本重定位目录的数据目录,它通常驻留在它自己的部分 -.reloc
. 此目录包含 DLL 中需要重新定位/修补的位置列表,以便它们指向正确的内存。大多数 EXE 文件没有这个目录,但一些旧的编译器会生成它们。
您可以在@MSDN阅读有关此主题的更多信息。
这个答案比我想象的要详细一点,但通读了一遍。
DLL:
在大多数情况下,DLL 文件是一个库。有几种类型的库,动态库和静态库 -了解它们的区别。DLL 代表动态链接库,它告诉我们它是程序的一部分,而不是全部。它由可重用的软件组件(库)组成,您可以将其用于多个程序。请记住,在许多应用程序中使用复制粘贴始终可以使用库源代码,但是 DLL/静态库的想法是您可以更新库的代码,同时使用更新所有应用程序它- 无需编译。
例如:
假设您正在创建一个Windows GUI 组件,例如Button。在大多数情况下,您希望重用您编写的代码,因为它是一个复杂但通用的组件 - 您希望许多应用程序使用它,但您不想给它们提供源代码 您无法复制- 在每个程序中粘贴按钮的代码,因此您决定要创建一个DL-Library (DLL)。
EXE cutables 需要这个“按钮”库才能运行,没有它他们将无法运行,因为他们不知道如何创建按钮,只知道如何与它交谈。
同样,DLL 无法执行 - 运行,因为它只是程序的一部分,但没有创建“进程”所需的信息。
EXE:
可执行文件是程序。它知道如何创建进程以及如何与 DLL 对话。它需要DLL 来创建一个按钮,如果没有它,应用程序将无法运行 - 错误。
希望这可以帮助....
DLL 和 EXE 都是可移植的可执行 (PE) 格式
动态链接库 (DLL)是一个库,因此不能直接执行。如果您尝试运行它,您将收到有关缺少入口点的错误。它需要一个入口点(主函数)才能执行,该入口点可以是任何应用程序或 exe。DLL 绑定发生在运行时。这就是为什么它被称为“动态链接”库。
可执行文件 (EXE)是可以执行的程序。它有自己的入口点。PE 头中的标志指示它是哪种类型的文件(与文件扩展名无关)。PE 头有一个字段,程序的入口点所在的位置。在 DLL 中不使用它(或至少不作为入口点)。
有许多软件可用于检查标题信息。导致两者工作方式不同的唯一区别是标题中的位,如下图所示。
EXE文件只有一个主入口意味着它是独立的应用程序,当系统启动exe时,会创建一个新进程,而DLL有很多入口点,所以当应用程序使用它时没有新进程启动,DLL可以重用和版本化。DLL 减少了存储空间,因为不同的程序可以使用相同的 dll。
DLL v/s exe
1)DLL文件是一个动态链接库,可以在exe文件和其他dll文件中使用。
EXE 文件是一个可执行文件,它在由操作系统管理的单独进程中运行。
2)DLL 不能直接执行。它们是包含函数的单独文件,程序和其他 DLL 可以调用这些函数来执行计算和函数。
EXE 是可以执行的程序。例如:Windows 程序
3)可重用性
DLL:它们可以被重用于其他一些应用程序。只要编码者知道DLL文件中函数和过程的名称和参数即可。
EXE:仅用于特定目的。
4) DLL 将共享调用应用程序的相同进程和内存空间,而
EXE 创建其单独的进程和内存空间。
5) 使用
DLL:您希望许多应用程序都使用它,但您不想给它们提供源代码您不能在每个程序中复制粘贴按钮的代码,因此您决定要创建一个 DL-库 (DLL)。
EXE:当我们使用 Windows 窗体应用程序、控制台应用程序、WPF 应用程序和 Windows 服务等项目模板时,它们在编译时会生成一个 exe 程序集。
6) 相似之处:
DLL 和 EXE 都是二进制文件,具有由 Portable Executable 格式定义的复杂嵌套结构,用户不能编辑它们。
两件事:存储在文件中的扩展名和标头标志。
这两个文件都是 PE 文件。两者都包含完全相同的布局。DLL 是一个库,因此无法执行。如果您尝试运行它,您将收到有关缺少入口点的错误。EXE 是可以执行的程序。它有一个入口点。PE 头中的标志指示它是哪种文件类型(与文件扩展名无关)。PE 头有一个字段,程序的入口点所在的位置。在 DLL 中不使用它(或至少不作为入口点)。
一个小的区别是,在大多数情况下,DLL都有一个导出部分,用于导出符号。EXE 不应该有导出部分,因为它们不是库,但没有什么能阻止这种情况的发生。Win32 加载程序不关心任何一种方式。
除此之外,它们是相同的。因此,总而言之,EXE 是可执行程序,而 DLL 是加载到进程中的库,并包含某种有用的功能,例如安全性、数据库访问或其他东西。
EXE 作为常规 Win32 可执行文件对系统可见。它的入口点是一个小型加载器,它初始化 .NET 运行时并告诉它加载和执行包含在 EXE 中的程序集。DLL 作为 Win32 DLL 对系统可见,但很可能没有任何入口点。.NET 运行时将有关包含的程序集的信息存储在其自己的标头中。
dll 是可重用函数的集合,其中 .exe 是可以调用这些函数的可执行文件
.exe 是程序。.dll 是 .exe(或另一个 .dll)可以调用的库。
sakthivignesh 所说的可能是真的,因为一个 .exe 可以使用另一个,就好像它是一个库一样,并且(例如)通过一些 COM 组件来完成。在这种情况下,“从属”.exe 是一个单独的程序(严格来说,一个单独的进程 - 可能在单独的机器上运行),但它接受和处理来自其他程序/组件/任何东西的请求。
但是,如果您只是从 Program Files 的文件夹中选择一个随机的 .exe 和 .dll,那么 COM 很可能不相关——它们只是一个程序及其动态链接的库。
使用 Win32 API,程序可以使用 LoadLibrary 和 GetProcAddress API 函数 IIRC 加载和使用 DLL。Win16中也有类似的功能。
COM 在许多方面是 DLL 思想的演变,最初被认为是 OLE2 的基础,而 .NET 是 COM 的后代。自 Windows 1 IIRC 以来,DLL 就一直存在。它们最初是在多个正在运行的程序之间共享二进制代码(特别是系统 API)的一种方式,以最大限度地减少内存使用。
exe是可执行程序,而DLL是可以由程序动态加载和执行的文件。
● .exe 和dll 是c# 代码的编译版本,也称为程序集。
● .exe 是一个独立的可执行文件,这意味着它可以直接执行。
● .dll 是可复用组件,不能直接执行,需要其他程序才能执行。
DLL和EXE的区别:
1) DLL 是一个进程内组件,这意味着在与客户端进程相同的内存空间中运行。EXE 是一个进程外组件,这意味着它在自己独立的内存空间中运行。
2) DLL 包含其他程序可以使用的函数和过程(促进可重用性),而 EXE 不能与其他程序共享。
3) DLL 不能直接执行,因为它们被设计为由其他程序加载和运行。EXE 是直接执行的程序。
DLL 和 EXE 之间的主要确切区别在于 DLL 没有入口点,而 EXE 有。如果您熟悉 c++,您可以看到构建 EXE 具有 main() 入口函数而 DLL 没有:)