.dll和.exe之间的区别?

Ume*_*wte 86 windows dll exe

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

Aam*_*mir 120

我不知道为什么每个人都在.NET的背景下回答这个问题.问题是一般问题,并没有在任何地方提到.NET.

那么,主要的区别是:

可执行程序

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

DLL

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

DLL和exe的文件格式基本相同.Windows通过文件中的PE标头识别DLL和EXE之间的区别.有关PE标头的详细信息,您可以在MSDN上查看此文章

  • 所以,如果你想要你重新命名并编辑fikle的标题,将dll变为exe,反之亦然? (3认同)

fir*_*umb 68

可执行程序:

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

DLL:

  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

  • 您的积分1和2不是100%正确.因为您可以在exe或dll上使用LoadLibraryEx,这意味着您可以使用GetProcAddress从exe或dll加载入口点.因此,在这方面,exe和dll文件都可以动态链接,并且可以包含任意数量的入口点. (11认同)
  • 系统将DLL加载到现有的PROCESS中,而不是线程中.进程中的每个DLL都可以通过`LibMain`函数在线程启动或停止时获得通知. (9认同)

Rob*_*Day 28

区别在于EXE有一个入口点,一个将在执行时运行的"main"方法.

需要从另一个应用程序调用DLL中的代码.

  • 这是错误加载,这意味着DLL没有入口点.DLL可能有一个DLLMain入口点,当DLL(其中包括)加载到进程中时调用该入口点 (10认同)

kic*_*hik 24

关于您可以提及的结构,还有一些差异.

  1. DLL和EXE共享相同的文件结构 - Portable Executable或PE.为了区分这两者,可以看一下里面的Characteristics成员.对于DLL,它打开了(0x2000)标志.对于EXE,它是(0x2)标志.IMAGE_FILE_HEADERIMAGE_NT_HEADERSIMAGE_FILE_DLLIMAGE_FILE_EXECUTABLE_IMAGE
  2. PE文件由一些标题和许多部分组成.通常有代码部分,数据部分,列出导入函数的部分和资源部分.某些部分可能包含多个内容.标题还描述了位于节中的数据目录列表.这些数据目录使Windows能够在PE中找到它所需的内容.但是EXE永远不会拥有的一种数据目录(除非你构建一个frankenstein 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上阅读有关此主题的更多信息.

  • 1. 因为是flag,所以可以同时设置。2. 如你所说,有可能,但几乎不可能。3. 如果可以,ASLR 也会重新定位 exe。所以是的,即使是 exe 也可以重定位。总而言之,作为 DLL 的 EXE 是*可能的,但很少*。 (2认同)

han*_*son 19

这个答案比我想象的更详细,但是通读了.

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

例如:
想象一下,您正在创建一个像Button一样的Windows GUI组件.在大多数情况下,您需要重新使用您编写的代码,因为它是一个复杂但常见的组件 - 您希望许多应用程序使用它但您不希望为它们提供源代码您无法复制- 在每个程序中粘贴按钮的代码,因此您决定要创建DL-Library(DLL).

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

同样,DLL无法执行 - 运行,因为它只是程序的一部分,但没有创建"进程"所需的信息.

EXE:
可执行程序是程序.它知道如何创建进程以及如何与DLL进行通信.它需要 DLL来创建一个按钮,如果没有它,应用程序就不会运行 - 错误.

希望这可以帮助....


Zah*_*med 14

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

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

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

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

头

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

  • 您说“PE 标头中的标志指示它是哪种类型的文件(与文件扩展名无关)”--- 那么这是否意味着扩展名是`.exe` 还是`.dll` 无关紧要?正是标题中的那个标志真正区分了它们......所以如果我制作一个`exe`并通过GUI交互将其命名为`.dll`,但是然后手动更改该标志,它仍然可以运行吗? (3认同)

ska*_*a93 6

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-库 (DLL)。

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

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