.dll和.exe之间的区别?


91

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


1
您应该在此处添加一些背景信息:您是初学者吗?您是否正在寻找PE物品的某种深层技术规范或其他内容
khebbie

3
我确实是个初学者。这是一个带标签的采访问题。
Umesh Aawte,2009年

更重要的是,这是一个副本,其中包括一个由sakthivignesh(已删除)的副本...
Marc Gravell

Answers:


71

可执行程序:

  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_anween_EXE_and_a_DLL

参考:http : //www.dotnetspider.com/forum/34260-What-difference-between-dll-exe.aspx


9
系统将DLL加载到现有的PROCESS中,而不是线程中。线程启动或停止时,进程中的每个DLL均可通过LibMain函数获得通知。
Daniel Earwicker,2009年

13
您的观点1和2并非100%正确。由于您可以在exe或dll上使用LoadLibraryEx,这意味着您可以使用GetProcAddress从exe或dll加载入口点。因此,在这方面,exe和dll文件都可以动态链接,并且可以具有任意数量的入口点。
jussij

131

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

好吧,主要的区别是:

可执行程序

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

动态链接库

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

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


4
因此,如果您想对自己的文件名进行重命名和编辑,以将dll转换为exe,反之亦然?
RCIX

@RCIX:我怀疑这可能吗?
VoodooChild

这很可能是不可能的-请参阅下面的kichik答案
Jonathon Reinhart 2013年

31

区别在于EXE具有入口点,即“ main”方法,该方法将在执行时运行。

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


11
这是错误的加载,这意味着DLL没有入口点。DLL可能具有DLLMain入口点,当DLL被加载到进程中时会调用DLLMain入口
jay.lee 2010年

29

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

  1. DLL和EXE共享相同的文件结构-可移植可执行文件或PE。要区分两者,可以查看inside 的Characteristics成员。对于DLL,它已打开(0x2000)标志。对于EXE,它是(0x2)标志。IMAGE_FILE_HEADERIMAGE_NT_HEADERSIMAGE_FILE_DLLIMAGE_FILE_EXECUTABLE_IMAGE
  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具有另一个称为“基本重定位目录”的数据目录的原因,该目录通常位于其自己的部分-中.reloc。此目录包含DLL中需要重新设置/修补的位置的列表,以便它们指向正确的内存。大多数EXE文件没有此目录,但是一些旧的编译器会生成它们。

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


1
1.由于这些标志,可以同时设置两者。2.正如您所说,这是可能的,但几乎不会消失。3. ASLR也将重新定位该exe。因此,是的,即使是exe也可以进行重定位。总而言之,作为DLL的EXE是可能的,但很少见
Deduplicator

20

这个答案比我想的要详细一些,但请仔细阅读。

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

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

EXE cutables 需要此“按钮”库才能运行,没有它,它们将无法运行,因为他们不知道如何创建按钮,仅知道如何与之交谈。

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

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

希望这可以帮助....


在.NET开发世界中,当您从其他模块(例如在C#中)导入内容时using SomeClassFromALibrary,该库是否通过DLL链接到项目?只是想看看,如果我理解正确的
阿卜杜勒

通常,您将关键字using用于名称空间,而不是类。using staticc#6提供了异常,该异常将导入指定类(链接)中存在的所有静态成员。该using关键字给出了一个承诺,编译器在运行时会出现包含该库的命名空间。该库未通过该DLL链接到项目,该DLL是链接到该项目(程序集)的库。该DLL包含编译时承诺的所有代码。
达里乌斯

16

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

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

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

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

标头

EXE文件只有一个主入口,这意味着它是隔离的应用程序,当系统启动exe时,将创建一个新进程,而DLL具有许多入口点,因此当应用程序使用它时,没有任何新进程启动,DLL可被重用和版本控制。DLL减少了存储空间,因为不同的程序可以使用相同的dll。


3
您说“ PE标头中的标志指示文件的类型(与文件扩展名无关)” ---那是否意味着扩展名是.exe.dll没有关系?正是标头中的那个标志才真正将它们区分开。...因此,如果我制作了一个exe,并通过GUI交互将其命名为.dll,然后手动更改了该标志,它仍然可以运行吗?
阿卜杜勒

4

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

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

一个小的区别是,在大多数情况下,DLL具有一个导出部分,在该部分中导出符号。EXE绝不应该包含导出节,因为它们不是库,但是没有阻止它的发生。Win32加载器不管哪种方式。

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


3
+1:很少有人意识到,从技术上讲,PE标头中的差异仅为1位
Serge Wautier 2011年

我想知道如果您回答那样会在面试中发生什么。他们:“ DLL和EXE有什么区别?” 您:“一位”。
JMI MADISON

4

dll v / s执行

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

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

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

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

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

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

6)相似之处:
DLL和EXE都是二进制文件,具有由可移植可执行文件格式定义的复杂嵌套结构,因此用户不希望对其进行编辑。


2

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

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

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

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

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


2

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

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


1
.NET运行时与.exe或.dll没有关系,它们是二进制机器代码文件(如果这些文件是使用.NET运行时的某种编程语言生成的,则涉及.NET运行时,但这已经是.NET运行时的职责了。 exe代码本身,而不是OS加载程序)。
Ped7g

1

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


6
可能有人认为您的答案不够详细。
JesperE

是的,人们可能不知道可执行程序是什么,这本身就成为一个全新的问题。
2014年

1

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

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

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


0

DLL和EXE的区别:

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

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

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


-1

请在投票时发表评论。

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

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

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.