.dll和.exe之间的区别?

我想知道DLLEXE文件之间的确切区别。

Solutions Collecting From Web of ".dll和.exe之间的区别?"

可执行程序:

  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

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

那么,主要的区别是:

可执行程序

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

DLL

  1. 一个DLL总是需要一个主机EXE运行。 即它永远不能在自己的地址空间中运行。
  2. DLL的目的是拥有一些可以从其他应用程序中重用的方法/类的集合。
  3. DLL是微软实施的一个共享库。

DLL和exe的文件格式基本相同。 Windows通过文件中的PE Header识别DLL和EXE之间的区别。 有关PE标题的详细信息, 可以查看MSDN上的这篇文章

不同之处在于EXE有一个入口点,一个“main”方法将在执行时运行。

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

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

  1. DLL和EXE都共享相同的文件结构 – 可移植可执行文件或PE。 为了区分这两者,可以在IMAGE_NT_HEADERS查找IMAGE_FILE_HEADERCharacteristics成员。 对于DLL,它具有IMAGE_FILE_DLL (0x2000)标志打开。 对于EXE,它是IMAGE_FILE_EXECUTABLE_IMAGE (0x2)标志。
  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有另一个数据目录称为基本重定位目录,通常驻留在它自己的部分 – .reloc 这个目录包含了需要重新绑定/打补丁的DLL中的位置列表,以便它们指向正确的内存。 大多数EXE文件没有这个目录,但是一些旧的编译器确实生成了它们。

你可以阅读更多关于这个主题@ MSDN 。

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

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

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

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

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

可执行程序:
一个可执行文件是程序 它知道如何创建一个进程,以及如何与DLL交谈。 需要 DLL来创建一个按钮,没有它的应用程序不会运行 – 错误。

希望这可以帮助….

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

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

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

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

头

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

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

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

一个微小的区别是,在大多数情况下DLL有一个导出部分的符号导出。 EXEs不应该有一个出口部分,因为他们不是图书馆,但没有阻止这种情况发生。 Win32加载器不关心任何方式。

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

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

DLL是一个可重复使用的函数的集合,作为一个.exe是一个可执行文件,可以调用这些函数

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

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

.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)的方式,以最大限度地减少内存使用。

DLL和EXE之间的主要确切的区别DLL没有入口点和EXE。 如果你熟悉c ++,你可以看到构建EXE有main()入口函数,而DLL没有

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

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

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