繁体   English   中英

.dll 和 .exe 的区别?

[英]Difference between .dll and .exe?

我想知道 dll 和 exe 文件之间的确切区别。

我不知道为什么每个人都在 .NET 的上下文中回答这个问题。 这个问题很笼统,并没有在任何地方提到 .NET。

嗯,主要的区别是:

可执行程序

  1. exe 总是在它自己的地址空间中运行,即,它是一个单独的进程。
  2. EXE 的目的是启动它自己的单独应用程序。

动态链接库

  1. dll 总是需要一个主机 exe 才能运行。 即,它永远不能在自己的地址空间中运行。
  2. DLL 的目的是拥有一组方法/类,这些方法/类可以从其他应用程序中重用。
  3. DLL 是 Microsoft 的共享库实现。

DLL 和 exe 的文件格式本质上是一样的。 Windows 通过文件中的 PE Header 来识别 DLL 和 EXE 之间的区别。 有关 PE Header 的详细信息,您可以查看 MSDN 上的这篇文章

可执行程序:

  1. 这是一个可执行文件
  2. 加载可执行文件时,不会调用导出,而只会调用模块入口点。
  3. 当系统启动新的可执行文件时,会创建一个新进程
  4. 在该进程的主线程的上下文中调用入口线程。

动态链接库:

  1. 这是一个动态链接库
  2. 有多个导出的符号。
  3. 系统将 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 中的代码需要从另一个应用程序调用。

关于您可以提到的结构,还有一些不同之处。

  1. DLL 和 EXE 共享相同的文件结构 - Portable Executable 或 PE。 为了区分两者,可以查看IMAGE_NT_HEADERSIMAGE_FILE_HEADERCharacteristics成员。 对于 DLL,它打开了IMAGE_FILE_DLL (0x2000) 标志。 对于 EXE,它是IMAGE_FILE_EXECUTABLE_IMAGE (0x2) 标志。
  2. PE 文件由一些标题和许多部分组成。 通常有一个代码部分、一个数据部分、一个列出导入函数的部分和一个资源部分。 某些部分可能包含不止一件事。 标题还描述了位于各节中的数据目录列表。 这些数据目录使 Windows 能够在 PE 中找到它需要的内容。 但是 EXE 永远不会拥有的一种类型的数据目录(除非您正在构建一个科学怪人 EXE)是导出目录。 这是 DLL 文件具有它们导出的函数列表并且可以被其他 EXE 或 DLL 文件使用的地方。 另一方面,每个 DLL 和 EXE 都有一个导入目录,其中列出了运行所需的函数和 DLL 文件。
  3. 在 PE 标头 ( IMAGE_OPTIONAL_HEADER ) 中还有ImageBase成员。 它指定 PE 假定将加载的虚拟地址。 如果它被加载到另一个地址,一些指针可能指向错误的内存。 由于 EXE 文件是最先加载到新地址空间的文件之一,因此 Windows 加载程序可以确保加载地址恒定,通常为 0x00400000。 DLL 不存在这种奢侈。 加载到同一个进程中的两个 DLL 文件可以请求相同的地址。 这就是为什么一个 DLL 有另一个数据目录,称为 Base Relocation Directory,它通常驻留在它自己的部分 - .reloc 此目录包含 DLL 中需要重新定位/修补的位置列表,以便它们指向正确的内存。 大多数 EXE 文件没有这个目录,但一些旧的编译器会生成它们。

您可以在@MSDN上阅读有关此主题的更多信息。

这个答案比我想象的要详细一些,但请通读一遍。

动态链接库:
在大多数情况下,DLL 文件是一个. 有几种类型的库,动态的和静态的 - 阅读区别 DLL 代表动态链接,它告诉我们它是程序的一部分,而不是整个程序。 它由可重用的软件组件()组成,您可以将其用于多个程序 请记住,始终可以使用复制粘贴在许多应用程序中使用库源代码,但 DLL/静态库的想法是您可以更新库的代码,同时使用它 - 无需编译。

例如:
想象一下,您正在创建一个类似于ButtonWindows GUI 组件 在大多数情况下,您希望重新使用您编写的代码,因为它是一个复杂但通用的组件 - 您希望许多应用程序使用它,但又不想向它们提供源代码 您无法复制- 在每个程序中粘贴按钮的代码,以便您决定要创建一个DL-Library (DLL)

这个“按钮”库是EXE cutables 运行所必需的,没有它它们将无法运行,因为它们不知道如何创建按钮,只知道如何与它对话。

同样,DLL 不能被执行 - 运行,因为它只是程序的一部分,但没有创建“进程”所需的信息。

可执行程序:
可执行文件是程序 它知道如何创建进程以及如何与 DLL 对话。 需要DLL 来创建一个按钮,如果没有它,应用程序将无法运行 - 错误。

希望这可以帮助....

DLL 和 EXE 都是可移植的可执行 (PE) 格式

动态链接库 (DLL)是一个库,因此不能直接执行。 如果您尝试运行它,您将收到有关缺少入口点的错误。 它需要一个入口点(主函数)来执行,入口点可以是任何应用程序或 exe。 DLL 绑定发生在运行时。 这就是为什么它被称为“动态链接”库。

可执行文件 (EXE)是可以执行的程序。 它有自己的入口点。 PE 标头内的标志指示它是哪种类型的文件(与文件扩展名无关)。 PE 标头有一个字段,程序的入口点位于该字段中。 在 DLL 中不使用它(或至少不用作入口点)。

有许多软件可用于检查标题信息。 导致两者工作方式不同的唯一区别是标题中的位,如下图所示。

标题

EXE 文件只有一个主入口意味着它是一个独立的应用程序,当系统启动 exe 时,会创建一个新进程,而 DLL 有许多入口点,因此当应用程序使用它时,不会启动新进程,DLL 可以重用和版本化。 DLL 减少了存储空间,因为不同的程序可以使用相同的 dll。

dll v/s ex​​e

1)DLL文件是一个动态链接库,可以在exe文件和其他dll文件中使用。
EXE 文件是一个可执行文件,它在由操作系统管理的单独进程中运行。

2)DLL 不能直接执行。 它们是单独的文件,其中包含可由程序和其他 DLL 调用以执行计算和函数的函数。
EXE 是可以执行的程序。 例如:Windows 程序

3)可重用性
DLL:它们可以重用于其他应用程序。 只要编码人员知道 DLL 文件中的函数和过程的名称和参数。
EXE:仅用于特定目的。

4) DLL 将共享调用应用程序的相同进程和内存空间,而
EXE 创建其单独的进程和内存空间。

5)用途
DLL:您希望许多应用程序使用它,但又不想向它们提供源代码 您无法在每个程序中复制粘贴按钮的代码,因此您决定要创建一个 DL-Library (DLL )。

EXE:当我们使用 Windows 窗体应用程序、控制台应用程序、WPF 应用程序和 Windows 服务等项目模板时,它们会在编译时生成一个 exe 程序集。

6)相似之处:
DLL 和 EXE 都是二进制文件,具有由 Portable Executable 格式定义的复杂嵌套结构,并且它们不能被用户编辑。

两件事:文件中存储的扩展名和标头标志。

这两个文件都是PE文件。 两者都包含完全相同的布局。 DLL 是一个库,因此无法执行。 如果您尝试运行它,您将收到有关缺少入口点的错误。 EXE 是可以执行的程序。 它有一个入口点。 PE 标头内的标志指示它是哪种文件类型(与文件扩展名无关)。 PE 标头有一个字段,程序的入口点位于该字段中。 在 DLL 中不使用它(或至少不用作入口点)。

一个微小的区别是,在大多数情况下, DLL都有一个导出部分,用于导出符号。 EXE 永远不应该有导出部分,因为它们不是库,但没有什么可以阻止这种情况发生。 Win32 加载程序不关心任何一种方式。

除此之外,它们是相同的。 因此,总而言之,EXE 是可执行程序,而 DLL 是加载到进程中的库,包含某种有用的功能,例如安全性、数据库访问等。

.exe 是程序。 .dll 是一个 .exe(或另一个 .dll)可以调用的库。

sakthivignesh 所说的可能是正确的,因为一个 .exe 可以像使用库一样使用另一个 .exe,并且这是(例如)使用某些 COM 组件完成的。 在这种情况下,“从” .exe 是一个单独的程序(严格来说,一个单独的进程 - 可能运行在一台单独的机器上),但它接受和处理来自其他程序/组件/任何东西的请求。

但是,如果您只是从 Program Files 中的文件夹中随机选择一个 .exe 和 .dll,则很可能与 COM 无关——它们只是一个程序及其动态链接的库。

使用 Win32 API,程序可以使用 LoadLibrary 和 GetProcAddress API 函数 IIRC 加载和使用 DLL。 Win16中也有类似的功能。

COM 在许多方面是 DLL 思想的演变,最初被认为是 OLE2 的基础,而 .NET 是 COM 的后代。 DLL 从 Windows 1、IIRC 开始就已经存在。 它们最初是一种在多个正在运行的程序之间共享二进制代码(特别是系统 API)以最小化内存使用的方式。

EXE 作为常规 Win32 可执行文件对系统可见。 它的入口点是指一个小的加载器,它初始化 .NET 运行时并告诉它加载和执行包含在 EXE 中的程序集。 DLL 作为 Win32 DLL 对系统可见,但很可能没有任何入口点。 .NET 运行时将有关包含的程序集的信息存储在其自己的标头中。

dll 是可重用函数的集合,其中 .exe 是可以调用这些函数的可执行文件

exe 是可执行程序,而 DLL 是可以由程序动态加载和执行的文件。

● .exe 和 dll 是 C# 代码的编译版本,也称为程序集。

● .exe 是一个独立的可执行文件,这意味着它可以直接执行。

● .dll 是一个可重用的组件,不能直接执行,需要其他程序来执行。

对于那些寻求简洁答案的人,

  • 如果程序集编译为类库并提供类型供其他程序集使用,则它具有 ifle 扩展名.dll (动态链接库),并且不能独立执行。

  • 同样,如果程序集被编译为应用程序,则它的文件扩展名为.exe (可执行文件)并且可以独立执行。 在 .NET Core 3.0 之前,控制台应用程序被编译为 .dll 文件,并且必须由 dotnet run 命令或主机可执行文件执行。 - 来源

DLL 和 EXE 的区别:

1) DLL 是进程内组件,这意味着与客户端进程在相同的内存空间中运行。 EXE 是一个进程外组件,这意味着它在自己独立的内存空间中运行。

2) DLL 包含其他程序可以使用的函数和过程(提高可重用性),而 EXE 不能与其他程序共享。

3) DLL 不能直接执行,因为它们被设计为由其他程序加载和运行。 EXE是直接执行的程序。

DLL 和 EXE 之间的主要确切区别在于 DLL 没有入口点而 EXE 有。 如果您熟悉 c++,您可以看到 build EXE 具有 main() 入口函数而 DLL 没有 :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM