独立可执行文件和已安装可执行文件之间的区别?


17

我至少在Windows上注意到,您可以下载一个直接的,静态链接的可执行文件并直接启动它,或者编写自己的程序并执行它(甚至是动态执行)而不必安装它。

这使我明白了重点...安装过程的目的是什么?我的意思是除了Windows注册表之外。但是,出于实用性和使用目的,可以有一个独立的独立程序,该程序可以运行,存储在非易失性存储器中,并可以通过所用设备的文件系统进行访问并在OS上执行。那么,如果许多几乎任何规模的优秀程序都可以在不经过安装配置的情况下完美运行,那么对所有“安装此”业务有何重大意义呢?这让我有些疑惑,除了数据库或其他元数据/访问配置系统之外,如果后者(已安装的可执行文件)执行并以与独立服务器相同的方式工作,那么这里的真正区别是什么?

我不知道未安装的程序与已安装的程序有什么区别吗?

PS:这不仅适用于Windows操作系统,而且还适用于实现类似功能的任何操作系统。

Answers:


16

程序作为安装程序而不是独立的可执行文件出现的原因有很多:

文件大小问题

  • 具有大量依赖关系的程序可以捆绑基于Web的安装程序,这些安装程序可以下载依赖关系并将它们放置在一个公共位置,以便可以被多个程序共享。例如,DirectX是一个非常大的库。如果系统上依赖DirectX的每个程序都将整个DirectX运行时与其捆绑在一起,则将占用大量空间。在使用4 TB硬盘的时代,这似乎无关紧要,但请考虑一下SSD的容量要小得多,并且它们已在超极本中普遍使用,其中有些超极本的存储容量仅为64 GB。当然,除了DirectX之外,还有许多其他共享库。

  • 既要大型又要不断更新的程序最好以许多小文件的集合的形式分发,并与启动程序或更新程序一起检查Internet上的更新,如果存在更新,则仅下载所需的更改。如果所有大型程序都作为单个整体可执行文件交付,则修补过程很可能需要重新下载整个可执行文件,因为由于文件锁定而几乎不可能修补磁盘上正在运行的可执行文件。另外,由于更新程序需要知道其文件在哪里,因此它通常将该目录路径存储在注册表中的一个众所周知的位置。

用户便利性问题

  • 如果大型程序的安装程序(例如Visual Studio和Microsoft Office)知道他们永远不需要它们,则安装程序允许用户取消选择某些功能的安装。这具有3个潜在的好处:减少了磁盘空间消耗;如果安装程序是Web下载程序,则可以减少下载时间和带宽消耗;并且可以减少用户机器上的“混乱”和“膨胀”,减少启动菜单/桌面快捷方式,减少启动程序等。

  • 复杂程序的安装程序通常带有配置选项,用户可以将用户友好的图形界面设置为安装程序的一部分。例如,请参阅MySQL或SQL Server安装程序,它们可以带您完成启动和运行数据库服务器的整个过程,甚至无需在安装程序上单击“完成”。

  • 安装程序可以提示用户输入所需信息,例如许可证密钥,只需输入一次即可。这样可以简化程序本身的设计,并减少程序要做的事情并检查启动时间。这也使用户有信心,一旦成功安装该程序,它就应该“正常工作”-程序中不再有可能阻止他们使用该程序的“陷阱”。

兼容性问题

  • 某些程序与其他程序冲突。这是软件工程的一个简单而不幸的事实。在安装已知与其他程序冲突的程序之前,首先检查系统以查看是否安装了不兼容的程序通常会很有帮助。然后可以向用户发出警报。例如,在较早版本的VMware和VirtualBox中存在非常危险的不兼容潜在性,导致出现蓝屏死机,因为一个程序在另一产品已经为用户保留后会尝试使用特殊的虚拟化处理器指令。 。如果您只是要将最终产品提供给用户而无需安装程序,则必须检查每个产品中是否存在不兼容的产品。 启动程序,这可能会减慢程序的启动速度。

  • 程序可能依赖于只能在系统范围内安装的其他系统组件,而不能在每个用户级别上安装。为了安装这些特殊的系统组件,通常需要管理特权,并且通常必须运行安装程序。

高特权和特殊服务

  • 某些程序的功能依赖于操作系统的更改,而如果没有某种安装程序来使用管理权限来照顾它们,就很难轻易实现这些更改。例如,安装驱动程序或内核模块的程序(例如Wireshark)不能简单可以运行,因为您绝对必须将内核模式组件放在单独的文件中。在绝对最佳的情况下,您仍然必须让用户手动解压缩存档,然后为设备驱动程序运行某种安装程序。服务是另一个需要安装管理权限的示例。安装程序软件特别擅长以优雅的方式获得管理员权限,而不要求主程序本身每次运行时都要求管理员权限(在许多情况下,这是不必要的安全风险)。

给出了安装程序为何有用的所有这些原因之后,下面是另一端的一些观察:

  • 许多程序,即使是仅可作为具有管理员权限的安装程序下载的程序,也可以从其安装程序中强行“拆包”并直接运行而无需安装它们。其他程序,尤其是开源程序,被PortableApps重新打包为独立的可执行文件。值得注意的是,某些程序从安装程序中解压缩后,功能将减少,出现错误或其他问题。

  • 在Windows以外的操作系统上,几乎总是可以简单地下载(或编译)程序并以常规用户身份运行它们,而无需获得root用户。软件包是操作系统的核心部分,但有一些例外,但是对于大多数用户应用程序,您可以在主目录中运行它,而无需使用软件包管理器在系统范围内进行安装。Windows有点特殊情况,因为Windows上的大多数桌面程序都有安装程序,通常无法以其他任何方式安装。

  • 即使在非Windows平台上,需要加载内核模块能力的程序也带有某种安装程序,该安装程序会编译内核模块并将其安装在正确的目录中。如果程序是将使用系统服务脚本启动的守护程序,则也可以期望看到安装程序,例如在中/etc/init.d。这种类型的“收缩包装二进制”是GNU / Linux上较不常用的分发方法,但是大多数Linux分发仍然以可安装软件包的形式提供大多数软件,每个软件包都需要root访问权限(管理员访问权限)才能安装。


结论

您问为什么我们需要安装程序。简短的答案是,无论如何我们都不是严格意义上的人。几乎没有应用程序的例子,原则上不能捆绑成一个没有资源,没有安装程序等的独立的可执行文件。即使像VMware Workstation这样复杂的事情也可以自动获得管理特权,将虚拟机监控程序内核模块写出来到磁盘上的文件,并在程序启动时动态安装它,并运送捆绑在可执行文件的数据部分中的所有资源(图像,声音等)。

使用安装与否是一个选择是软件生产商必须做出。使用安装程序有优点和缺点。许多厂商选择发布他们的软件作为一个安装程序,作为一个独立的二进制文件,或作为一个ZIP文件,可以简单地被解压并运行至少。对于不需要安装程序的软件,这是一种非常实用的方法,可以使所有人满意。通常,除了安装程序以外,其他任何形式的软件都是需要管理特权才能安装其自身某些组件的软件,因为安装程序是获得所需特权的最简便方法。

就个人而言,我发现安装程序在我的日常工作中非常烦人,因为有时我想在我没有使用的计算机的管理权限时运行程序。我有丰富的经验,手动解压安装程序以提取其中的程序文​​件,然后使这些文件正确运行。但是,在我总是可以进行管理访问的个人PC上,我发现安装程序既有益又方便,因为大多数安装程序都为我提供了有用的选项,例如是否创建桌面快捷方式,如果没有,我将不得不手动执行。


很好的答案,但是用DirectX和运行时打开是没有意义的。首先,DirectX的唯一运行时处于其自身编写的语言(即C

@TomTurkey嗯...什么?为什么用什么语言写都重要?当然,您可以将所需的任何DirectX组件直接静态链接到可执行文件中,但是就像我说的那样,如果许多程序开始使用大型库(例如,Qt 4.x,运行大约40 MB),就会出现文件大小问题)。该代码必须在某处,并且您不能仅仅假设您所需的DirectX版本已安装在系统上,否则当有人在未修补Windows XP SP2的程序中打开您的程序时,您将得到一个错误。年龄。
allquixotic

4
哦,我认为您误会了我-在我的回答中,我不是在谈论安装DirectX本身;我说的是安装依赖 DirectX 的程序。为了满足这种依赖性,您可以将DirectX直接编译到您的应用程序中,从而增加浪费的磁盘空间,也可以在安装程序中捆绑一个小应用程序,以检查您是否安装了合适的DirectX运行时,如果没有,则下载它们并将它们放置在集中的系统位置。就磁盘空间和下载大小而言,后者要高效得多。
allquixotic

3
@allquixotic另外,许可。有时,可能未获得与安装程序无关的库许可。我不确定DirectX可能属于此类。我认为.NET框架可以。这不是技术限制,而是法律限制。(不过.NET框架还有其他技术限制。它已紧密集成到操作系统中。)
Bob

1
BOOP。发表评论的声音。在我脑海中。
allquixotic

3

安装过程将考虑以下各项:

  1. 是否已安装所需的库(api)(例如.net框架版本)或DirectX。

  2. 将一些额外的系统DLL文件安装到系统文件夹中。如果系统文件夹已包含这些文件(相同版本),则忽略此步骤。这样,您不需要相同DLL文件的多个副本。

  3. 在“开始”菜单或“桌面”中安装快捷方式,以帮助您快速启动应用程序。

  4. 如您所说,注册表修改。当此应用程序首次在此计算机上执行时,实际上可以完成此步骤,因此它并不是特别重要。

  5. 非常重要:是否将软件(例如Google桌面栏或Yahoo!栏捆绑到您的IE中)。这是许多独立软件为开发人员创造收入的方式。如果您使用的是自由软件,请不要忘记。

因为我们正在考虑一个“可执行”应用程序,所以我们不需要讨论那些可以安装IE附加组件或相关内容的步骤。


3

独立程序没有外部依赖性。

它不必仅是.exe文件,还可以包含随附的库和数据文件:将存档解压缩到文件夹中并运行可执行文件。如果仅解压缩存档文件,则不会在“开始”菜单中添加任何快捷方式,因此,您必须导航到解压缩的应用程序所在的文件夹并从此处启动它,或者在“开始”菜单中手动为其创建快捷方式。许多计算机用户发现这很困难。

更容易使用

安装程序将指导用户完成安装过程。您下载安装程序.exe或.msi(非高级用户最好使用前者),然后运行它。它通常会在中拾取安装文件夹,Program Files复制文件,并在“开始”菜单中创建快捷方式。您已完成:在大多数情况下,只需单击几次Next。

然后转到“开始”菜单并运行该应用程序。某些安装程序提供了在安装完成后启动应用程序的选项。

如果应用程序打开某些类型的文件或文档,则安装程序会在外壳程序中注册它。这样您就可以单击该文件以将其打开。

许可协议

许多应用程序(包括商业应用程序和免费应用程序)都要求您接受许可协议,然后才能使用它们的应用程序。在您确认同意许可条款之前,安装不会继续进行。即使您没有阅读许可证,也已经同意。

依存关系

有时仅仅复制可执行文件是不够的。应用程序通常使用共享组件或特殊的运行时库。例如,必须安装.Net框架运行时才能运行为.Net编写的应用程序。即使不是静态链接的Visual C ++运行时,也必须安装。安装程序负责确保满足所有依赖性。

如果应用程序由多个.exe和/或.dll文件组成,则动态链接到Visual C ++运行时会减少磁盘空间。如果.exe和.dll是静态链接的,则运行时将在每个文件中重复。

库的许可条款可能不允许静态链接。

安全

如果在运行时中发现漏洞,则可以与应用程序分开更新。通过Windows Update自动安装.Net和Visual C ++运行时的更新。

如果可执行文件和库是静态链接的,则应用程序供应商必须重新编译应用程序并发布更新的版本。因此,使用共享的运行时可以减少开发人员和供应商的应用程序维护成本。

安装到Program Files还提供了更安全的环境:没有管理员权限,无法修改或删除其中的文件。

登记处

许多Windows应用程序都依赖注册表中的条目。如果应用程序使用COM,则必须注册所有对象,否则应用程序将无法创建所需的对象,并且将无法启动。


1
+1用于共享组件的安全更新-我不认为应该在答案中写出来。
allquixotic

0

简要答案:独立exe不需要在计算机上安装任何库即可运行,并且不需要注册表项或其他组件。

一个已安装的文件可以是安装程序包中的独立文件,但通常取决于与其一起安装的各种组件和库。

在许多情况下,通过Universal Extractor(非官方更新:here),您可以提取安装程序的内容并运行程序,而无需Windows中的管理特权。可以使用lessmsi打开MSI安装程序的包装。

在大多数其他操作系统中,可以通过用户特定的“ bin”,“ lib”和主目录中的其他目录来运行所有程序,而无需root / administrator特权。就个人而言,我大部分时间都鄙视安装程序,因为当我没有安装特权时,它们会使我更难以使用没有管理特权的程序。但是,大公司以这种方式打包它们,以简化普通最终用户的流程。

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.