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