![](/img/trans.png)
[英]Difference between running Eclipse on jvm.dll and java.exe (or javaw.exe)
[英]Difference between .dll and .exe?
我想知道 dll 和 exe 文件之间的确切区别。
我不知道为什么每个人都在 .NET 的上下文中回答这个问题。 这个问题很笼统,并没有在任何地方提到 .NET。
嗯,主要的区别是:
可执行程序
动态链接库
DLL 和 exe 的文件格式本质上是一样的。 Windows 通过文件中的 PE Header 来识别 DLL 和 EXE 之间的区别。 有关 PE Header 的详细信息,您可以查看 MSDN 上的这篇文章
可执行程序:
动态链接库:
更多详情: 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
不同之处在于 EXE 有一个入口点,一个将在执行时运行的“主”方法。
DLL 中的代码需要从另一个应用程序调用。
关于您可以提到的结构,还有一些不同之处。
IMAGE_NT_HEADERS
中IMAGE_FILE_HEADER
的Characteristics
成员。 对于 DLL,它打开了IMAGE_FILE_DLL
(0x2000) 标志。 对于 EXE,它是IMAGE_FILE_EXECUTABLE_IMAGE
(0x2) 标志。IMAGE_OPTIONAL_HEADER
) 中还有ImageBase
成员。 它指定 PE 假定将加载的虚拟地址。 如果它被加载到另一个地址,一些指针可能指向错误的内存。 由于 EXE 文件是最先加载到新地址空间的文件之一,因此 Windows 加载程序可以确保加载地址恒定,通常为 0x00400000。 DLL 不存在这种奢侈。 加载到同一个进程中的两个 DLL 文件可以请求相同的地址。 这就是为什么一个 DLL 有另一个数据目录,称为 Base Relocation Directory,它通常驻留在它自己的部分 - .reloc
。 此目录包含 DLL 中需要重新定位/修补的位置列表,以便它们指向正确的内存。 大多数 EXE 文件没有这个目录,但一些旧的编译器会生成它们。您可以在@MSDN上阅读有关此主题的更多信息。
这个答案比我想象的要详细一些,但请通读一遍。
动态链接库:
在大多数情况下,DLL 文件是一个库. 有几种类型的库,动态的和静态的 - 阅读区别。 DLL 代表动态链接库,它告诉我们它是程序的一部分,而不是整个程序。 它由可重用的软件组件(库)组成,您可以将其用于多个程序。 请记住,始终可以使用复制粘贴在许多应用程序中使用库源代码,但 DLL/静态库的想法是您可以更新库的代码,同时使用它 - 无需编译。
例如:
想象一下,您正在创建一个类似于Button的Windows GUI 组件。 在大多数情况下,您希望重新使用您编写的代码,因为它是一个复杂但通用的组件 - 您希望许多应用程序使用它,但又不想向它们提供源代码 您无法复制- 在每个程序中粘贴按钮的代码,以便您决定要创建一个DL-Library (DLL) 。
这个“按钮”库是EXE cutables 运行所必需的,没有它它们将无法运行,因为它们不知道如何创建按钮,只知道如何与它对话。
同样,DLL 不能被执行 - 运行,因为它只是程序的一部分,但没有创建“进程”所需的信息。
可执行程序:
可执行文件是程序。 它知道如何创建进程以及如何与 DLL 对话。 它需要DLL 来创建一个按钮,如果没有它,应用程序将无法运行 - 错误。
希望这可以帮助....
DLL 和 EXE 都是可移植的可执行 (PE) 格式
动态链接库 (DLL)是一个库,因此不能直接执行。 如果您尝试运行它,您将收到有关缺少入口点的错误。 它需要一个入口点(主函数)来执行,入口点可以是任何应用程序或 exe。 DLL 绑定发生在运行时。 这就是为什么它被称为“动态链接”库。
可执行文件 (EXE)是可以执行的程序。 它有自己的入口点。 PE 标头内的标志指示它是哪种类型的文件(与文件扩展名无关)。 PE 标头有一个字段,程序的入口点位于该字段中。 在 DLL 中不使用它(或至少不用作入口点)。
有许多软件可用于检查标题信息。 导致两者工作方式不同的唯一区别是标题中的位,如下图所示。
EXE 文件只有一个主入口意味着它是一个独立的应用程序,当系统启动 exe 时,会创建一个新进程,而 DLL 有许多入口点,因此当应用程序使用它时,不会启动新进程,DLL 可以重用和版本化。 DLL 减少了存储空间,因为不同的程序可以使用相同的 dll。
dll v/s exe
1)DLL文件是一个动态链接库,可以在exe文件和其他dll文件中使用。
EXE 文件是一个可执行文件,它在由操作系统管理的单独进程中运行。
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 都是二进制文件,具有由 Portable Executable 格式定义的复杂嵌套结构,并且它们不能被用户编辑。
两件事:文件中存储的扩展名和标头标志。
这两个文件都是PE文件。 两者都包含完全相同的布局。 DLL 是一个库,因此无法执行。 如果您尝试运行它,您将收到有关缺少入口点的错误。 EXE 是可以执行的程序。 它有一个入口点。 PE 标头内的标志指示它是哪种文件类型(与文件扩展名无关)。 PE 标头有一个字段,程序的入口点位于该字段中。 在 DLL 中不使用它(或至少不用作入口点)。
一个微小的区别是,在大多数情况下, DLL都有一个导出部分,用于导出符号。 EXE 永远不应该有导出部分,因为它们不是库,但没有什么可以阻止这种情况发生。 Win32 加载程序不关心任何一种方式。
除此之外,它们是相同的。 因此,总而言之,EXE 是可执行程序,而 DLL 是加载到进程中的库,包含某种有用的功能,例如安全性、数据库访问等。
.exe 是程序。 .dll 是一个 .exe(或另一个 .dll)可以调用的库。
sakthivignesh 所说的可能是正确的,因为一个 .exe 可以像使用库一样使用另一个 .exe,并且这是(例如)使用某些 COM 组件完成的。 在这种情况下,“从” .exe 是一个单独的程序(严格来说,一个单独的进程 - 可能运行在一台单独的机器上),但它接受和处理来自其他程序/组件/任何东西的请求。
但是,如果您只是从 Program Files 中的文件夹中随机选择一个 .exe 和 .dll,则很可能与 COM 无关——它们只是一个程序及其动态链接的库。
使用 Win32 API,程序可以使用 LoadLibrary 和 GetProcAddress API 函数 IIRC 加载和使用 DLL。 Win16中也有类似的功能。
COM 在许多方面是 DLL 思想的演变,最初被认为是 OLE2 的基础,而 .NET 是 COM 的后代。 DLL 从 Windows 1、IIRC 开始就已经存在。 它们最初是一种在多个正在运行的程序之间共享二进制代码(特别是系统 API)以最小化内存使用的方式。
EXE 作为常规 Win32 可执行文件对系统可见。 它的入口点是指一个小的加载器,它初始化 .NET 运行时并告诉它加载和执行包含在 EXE 中的程序集。 DLL 作为 Win32 DLL 对系统可见,但很可能没有任何入口点。 .NET 运行时将有关包含的程序集的信息存储在其自己的标头中。
dll 是可重用函数的集合,其中 .exe 是可以调用这些函数的可执行文件
exe 是可执行程序,而 DLL 是可以由程序动态加载和执行的文件。
● .exe 和 dll 是 C# 代码的编译版本,也称为程序集。
● .exe 是一个独立的可执行文件,这意味着它可以直接执行。
● .dll 是一个可重用的组件,不能直接执行,需要其他程序来执行。
1) DLL 是进程内组件,这意味着与客户端进程在相同的内存空间中运行。 EXE 是一个进程外组件,这意味着它在自己独立的内存空间中运行。
2) DLL 包含其他程序可以使用的函数和过程(提高可重用性),而 EXE 不能与其他程序共享。
3) DLL 不能直接执行,因为它们被设计为由其他程序加载和运行。 EXE是直接执行的程序。
DLL 和 EXE 之间的主要确切区别在于 DLL 没有入口点而 EXE 有。 如果您熟悉 c++,您可以看到 build EXE 具有 main() 入口函数而 DLL 没有 :)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.