7zip Self Extracting Archive(SFX)和.Net Installer

时间:2012-07-12 19:46:28

标签: .net installer 7zip sfx

我正在尝试为我编写的Windows应用程序创建一个自解压存档。我的应用程序使用最新的.Net 4.0,我想在SFX安装程序中包含.Net设置。但是,如果计算机需要安装.Net框架并重新启动,则无法正常恢复安装我的应用程序。我查看了堆栈站点上的其他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,但如有必要,我会考虑使用其他工具。

2 个答案:

答案 0 :(得分:2)

问题是SFX在setup.exe完成后删除了解压缩的文件。为避免这种情况,您可以使用InstallPath参数:

;!@Install@!UTF-8!
Title="MyApp Installer"
ExecuteFile="setup.exe"
InstallPath="%temp%\\My App"
;!@InstallEnd@!

但在这种情况下,根本不会删除提取的文件。例如,您可以在MSI中删除这些文件。

PS。如果您的客户将通过远程桌面会话运行安装程序,您还需要考虑this issue

答案 1 :(得分:2)

我找到了一个我认为非常可以接受的解决方案。由于问题是由于sfx temp文件夹在重新启动时自行删除,因此我运行批处理文件而不是setup.exe。批处理文件将temp目录中的所有内容复制到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所说,这在技术上是一个问题,因为它会持续到用户手动删除临时文件,但是与现代硬盘驱动器相比,我的应用程序的大小是可接受的