7zip自解压归档(SFX)和.Net安装程序。

6
我正在尝试为我编写的Windows应用创建自解压缩存档。我的应用程序使用最新的.Net 4.0,并且我想在SFX安装程序中包含.Net设置。但是,如果计算机需要安装.Net框架并重新启动,则无法正确恢复安装我的应用程序。我浏览了Stack网站上其他有关sfx的帖子,但其中没有一个涉及将.Net安装程序作为应用程序先决条件的问题。
我的项目生成4个文件:“App Installer.msi”、“setup.exe”、“WindowsInstaller-KB893803-v2-x86.exe”(在文件夹“WindowsInstaller3_1”中)和“dotNetFx40_Client_x86_x64.exe”(在文件夹“DotNetFX40Client”中),我认为这些都是标准的。
我使用7zip按以下方式创建SFX:
首先,使用7zip将所有文件压缩到单个存档中:
7z.exe a -r AppInstallFiles.7z *

接下来,我使用7zS.sfx文件(用于创建自解压式安装程序)、我的配置文件和归档文件进行二进制复制。配置文件如下:

;!@Install@!UTF-8!
Title="MyApp Installer"
ExecuteFile="setup.exe"
;!@InstallEnd@!

我会用下面的代码行来复制它们:

copy /b 7zS.sfx + config.txt + AppInstallFiles.7z MyAppInstaller.exe

安装程序可以在已经安装了 .Net 4.0 的计算机上完美运行。我的问题出现在没有 .Net Framework 的计算机上 - 我运行 SFX,它将所有内容提取到临时目录中。然后,当 setup.exe 发现计算机没有 .Net 4.0 时,它调用 .Net Installer。这会提取到自己的临时目录并开始安装。完成后,它提示重新启动。点击“否”退出整个安装过程。点击“是”重新启动机器,在登录后会出现错误:“尝试安装 MyApp 时发生错误”,详细信息为“无法定位应用程序文件 'App Installer.msi'”。
问题似乎是当安装程序移交给 .Net 安装程序时,.Net 安装程序重新启动并删除包含 My App 安装文件的临时目录。我尝试从 setup.exe 切换到使用“App Installer.msi”,但这只会导致 msi 报告计算机没有 .Net 并建议进行网络下载。由于我可能在离线情况下安装应用程序,因此这对我没有用。
是否有其他人在 7zip SFX 中尝试过包含 .Net 安装程序,如果有,他们是如何解决的?如果可能的话,我更愿意继续使用 7zip,但必要时也会考虑其他工具。

因此,作为一种临时解决方案,我创建了一个批处理脚本,调用了两个更新(WindowsInstaller和dotNetFx40_Client_x86_x64),并加上了/norestart标志。这并不理想,因为a)如果已经安装了.NET安装程序,则该方法不会自动跳过.NET安装程序步骤,b)我无法传递消息,提示用户在使用应用程序之前重新启动。它还会创建一个cmd窗口,最好避免。 - L.J.
2个回答

2
问题在于SFX会在setup.exe完成后删除提取的文件。为避免此问题,您可以使用InstallPath参数:
;!@Install@!UTF-8!
Title="MyApp Installer"
ExecuteFile="setup.exe"
InstallPath="%temp%\\My App"
;!@InstallEnd@!

但在这种情况下,提取的文件根本不会被删除。您可以在您的MSI中删除这些文件,例如。
附:如果您的客户通过远程桌面会话运行安装程序,则还需要考虑此问题。请参见此问题

实际上,7zip 9.20没有这个标志,虽然我在多个地方看到了它的提及(参见http://sourceforge.net/projects/sevenzip/forums/forum/45798/topic/4626250-来自创建者,“7-Zip SFX不支持“InstallPath”变量”,以及从文档中看到,唯一的参数是Title、BeginPrompt、Progress、RunProgram、Directory、ExecuteFile和ExecuteParameters。 不过,我最终做了类似的事情 - 请参见我的下面的答案。 - L.J.
另外,感谢您提醒远程桌面问题,但这对我来说不是问题。似乎我可以将其解压到程序文件中的应用程序(假定)目录中以避免此问题。然而,对于在其他位置安装应用程序并不希望%programfiles%\MYAPP文件夹存在的用户来说,这可能会很烦人。 - L.J.
2
我们使用来自http://7zsfx.info/en/的修改版7zip SFX。它支持InstallPath和许多其他参数。 - Serghei Gorodetki
@Serghei的链接变更日志显示该软件包的最后编辑时间为2007年。 - AnneTheAgile

2
我选择了一种我认为相当可接受的解决方案。由于问题是由于 sfx 临时文件夹在重新启动时删除导致的,所以我运行一个批处理文件而不是 setup.exe。批处理文件将 temp 目录中的所有内容复制到一个新目录中,并从该目录调用 setup:
::install.cmd, used to move the setup files to another directory before executing
xcopy /s * ..\MY_APP\
::use start to hide the cmd window
start ..\MY_APP\setup.exe

这个文件夹会在重启后保留,使安装程序可以继续进行。正如serghei所指出的那样,这在技术上是一个问题,因为它会持续到用户手动删除临时文件,但考虑到我的应用程序与现代硬盘的比较,这是可以接受的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接