.dll和.exe之间的区别?

时间:2009-07-31 06:03:49

标签: windows dll exe

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

15 个答案:

答案 0 :(得分:118)

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

嗯,主要区别是:

<强> EXE

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

    1. 一个DLL总是需要一个主机exe才能运行。即,它永远不能在自己的地址空间中运行。
    2. DLL的目的是拥有一组方法/类,可以从其他应用程序中重复使用。
    3. DLL是Microsoft的共享库实现。
    4. DLL和exe的文件格式基本相同。 Windows通过文件中的PE标头识别DLL和EXE之间的区别。有关PE标题的详细信息,You can have a look at this Article on MSDN

答案 1 :(得分:64)

EXE:

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

    1. 这是一个动态链接库
    2. 有多个导出符号。
    3. 系统将DLL加载到现有流程的上下文中。
    4. 更多详情: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

答案 2 :(得分:26)

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

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

答案 3 :(得分:24)

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

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

答案 4 :(得分:17)

这个答案比我想象的要详细一点,但是要仔细阅读。

<强> DLL:
在大多数情况下,DLL文件是。有两种类型的库,动态和静态 - read about the difference。 DLL代表dynamic link library,它告诉我们它是程序的部分整个事情。它由可重复使用的软件组件(library)组成,您可以将其用于多个程序。请记住,使用复制粘贴在许多应用程序中始终可以使用库源代码,但DLL /静态库的想法是您可以更新库的代码,同时使用更新所有应用程序它 - 没有编译。

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

EXE 可剪切片段需要“按钮”库才能运行,如果没有它,它们将无法运行,因为它们不知道如何创建按钮,仅怎么跟它说话。

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

<强> EXE:
可执行文件是程序。它知道如何创建process以及如何与DLL对话。它需要 DLL来创建一个按钮,如果没有它,应用程序就不会运行 - 错误。

希望这会有所帮助......

答案 5 :(得分:14)

DLL和EXE都是Portable Executable(PE) Formats

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

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

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

  

header

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

答案 6 :(得分:4)

Dll v / s Exe

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

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都是二进制文件,具有由可执行文件格式定义的复杂嵌套结构,并且不能由用户编辑。

答案 7 :(得分:3)

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

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

一个小的区别是,在大多数情况下DLLs有一个导出部分,其中导出符号。 EXE永远不应该有一个导出部分,因为它们不是库,但没有什么可以防止这种情况发生。 Win32加载器无论如何都不关心。

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

答案 8 :(得分:2)

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

  

dll是可重用的集合   作为.exe的函数   可执行文件可以调用这些   功能

答案 9 :(得分:1)

.exe是程序。 .dll是.exe(或其他.dll)可能调用的库。

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

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

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

COM在很多方面都是DLL思想的演变,最初被认为是OLE2的基础,而.NET则是COM的后代。自Windows 1,IIRC以来,DLL一直存在。它们最初是一种在多个正在运行的程序之间共享二进制代码(特别是系统API)的方法,以便最大限度地减少内存使用。

答案 10 :(得分:1)

●.exe和dll是c#代码的编译版本,也称为 组件。

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

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

答案 11 :(得分:0)

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

答案 12 :(得分:0)

DLL和EXE中的区别:

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

2)DLL包含其他程序可以使用的功能和过程(促进可重用性),而EXE无法与其他程序共享。

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

答案 13 :(得分:-1)

请在投票时发表评论。

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

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

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

  •   

答案 14 :(得分:-2)

DLL和EXE之间的主要区别是DLL没有入口点和EXE。如果您熟悉c ++,您可以看到构建EXE具有main()入口函数而DLL不具备:)