我想知道dll和exe文件之间的确切区别。
我想知道dll和exe文件之间的确切区别。
Answers:
可执行程序:
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
LibMain
函数获得通知。
我不知道为什么每个人都在.NET中回答这个问题。这个问题是一个普遍的问题,在任何地方都没有提到.NET。
好吧,主要的区别是:
可执行程序
动态链接库
DLL和exe的文件格式基本相同。Windows通过文件中的PE标头识别DLL和EXE之间的差异。有关PE标头的详细信息,可以在MSDN上查看此文章。
区别在于EXE具有入口点,即“ main”方法,该方法将在执行时运行。
DLL中的代码需要从另一个应用程序中调用。
关于您可以提及的结构,还有一些其他差异。
Characteristics
成员。对于DLL,它已打开(0x2000)标志。对于EXE,它是(0x2)标志。IMAGE_FILE_HEADER
IMAGE_NT_HEADERS
IMAGE_FILE_DLL
IMAGE_FILE_EXECUTABLE_IMAGE
IMAGE_OPTIONAL_HEADER
)中也是该ImageBase
成员。它指定PE假定将在其上加载的虚拟地址。如果将其加载到另一个地址,则某些指针可能指向错误的内存。由于EXE文件是第一个要加载到其新地址空间中的文件,因此Windows加载程序可以确保恒定的加载地址,通常为0x00400000。DLL不存在这种奢侈。加载到同一进程中的两个DLL文件可以请求相同的地址。这就是DLL具有另一个称为“基本重定位目录”的数据目录的原因,该目录通常位于其自己的部分-中.reloc
。此目录包含DLL中需要重新设置/修补的位置的列表,以便它们指向正确的内存。大多数EXE文件没有此目录,但是一些旧的编译器会生成它们。您可以阅读有关此主题的更多信息@ MSDN。
这个答案比我想的要详细一些,但请仔细阅读。
DLL:
在大多数情况下,DLL文件是一个library。有两种类型的库,即动态库和静态库,请阅读其中的区别。DLL代表动态链接库,它告诉我们它是程序的一部分,而不是全部。它由可重用的软件组件(库)组成,可用于多个程序。请记住,在许多使用复制粘贴的应用程序中始终可以使用库源代码,但是DLL /静态库的想法是您可以更新库的代码,并同时使用来更新所有应用程序。它-无需编译。
例如:
想象您正在创建一个Windows Button组件,例如Button。在大多数情况下,您想重复使用编写的代码,因为它是一个复杂但通用的组件-您希望许多应用程序使用它,但又不想将它们提供给您源代码,您无法复制-在每个程序中粘贴按钮的代码,因此您决定要创建DL-Library(DLL)。
EXE cutables 需要此“按钮”库才能运行,没有它,它们将无法运行,因为他们不知道如何创建按钮,仅知道如何与之交谈。
同样,无法执行DLL,因为它只是程序的一部分,但是没有创建“进程”所需的信息。
EXE:
可执行文件是program。它知道如何创建进程以及如何与DLL通讯。它需要 DLL来创建一个按钮,没有它,应用程序将无法运行-错误。
希望这可以帮助....
using SomeClassFromALibrary
,该库是否通过DLL链接到项目?只是想看看,如果我理解正确的
DLL和EXE都是可移植可执行(PE)格式
甲动态链接库(DLL)是一个库,因此无法直接执行。如果尝试运行它,将会收到有关缺少入口点的错误。它需要一个入口点(主要功能)才能执行,该入口点可以是任何应用程序或exe。DLL绑定在运行时发生。这就是为什么它称为“动态链接”库。
一个可执行文件(EXE)是可被执行的程序。它有自己的入口点。PE标头中的标志指示文件的类型(与文件扩展名无关)。PE标头具有一个字段,该字段是程序的入口点所在的位置。在DLL中,不使用它(或至少不将其用作入口点)。
有许多软件可用于检查标题信息。导致两者工作不同的唯一区别是报头中的位,如下图所示。
EXE文件只有一个主入口,这意味着它是隔离的应用程序,当系统启动exe时,将创建一个新进程,而DLL具有许多入口点,因此当应用程序使用它时,没有任何新进程启动,DLL可被重用和版本控制。DLL减少了存储空间,因为不同的程序可以使用相同的dll。
.exe
或.dll
没有关系?正是标头中的那个标志才真正将它们区分开。...因此,如果我制作了一个exe
,并通过GUI交互将其命名为.dll
,然后手动更改了该标志,它仍然可以运行吗?
两件事:扩展名和存储在文件中的标头标志。
这两个文件都是PE文件。两者都包含完全相同的布局。DLL是一个库,因此无法执行。如果尝试运行它,将会收到有关缺少入口点的错误。EXE是可以执行的程序。它有一个入口点。PE标头中的标志指示它是哪种文件类型(与文件扩展名无关)。PE标头具有一个字段,该字段是程序的入口点所在的位置。在DLL中,不使用它(或至少不将其用作入口点)。
一个小的区别是,在大多数情况下,DLL具有一个导出部分,在该部分中导出符号。EXE绝不应该包含导出节,因为它们不是库,但是没有阻止它的发生。Win32加载器不管哪种方式。
除此之外,它们是相同的。因此,总而言之,EXE是可执行程序,而DLL是加载到进程中的库,并且包含某种有用的功能,例如安全性,数据库访问等。
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都是二进制文件,具有由可移植可执行文件格式定义的复杂嵌套结构,因此用户不希望对其进行编辑。
.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)的一种方式,以最大程度地减少内存使用。
EXE作为常规Win32可执行文件对系统可见。它的入口指向小型加载程序,该加载程序初始化.NET运行时,并告诉它加载并执行EXE中包含的程序集。DLL作为Win32 DLL对系统可见,但很可能没有任何入口点。.NET运行时将有关所包含程序集的信息存储在其自己的标头中。
dll是可重用函数的集合,其中,.exe是可执行文件,可以调用这些函数
DLL和EXE之间存在DLL和EXE之间的主要确切区别,即DLL没有入口点。如果您熟悉c ++,则可以看到build EXE具有main()入口函数,而DLL没有:)