我正试图为我编写的一个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安装程序。这将提取到自己的临时目录并开始安装。完成后,它会提示重新启动。点击"否"将退出整个安装过程。点击"是"会重新启动机器,重新登录时出现错误:"尝试安装MyApp时出错",详细信息为"无法定位应用程序文件‘App Installer.msi’"
问题似乎是,当安装程序移交给.Net安装程序,.Net安装程序重新启动时,包含My App安装文件的临时目录会被删除。我尝试过从setup.exe切换到使用"App Installer.msi",但这只会导致msi报告计算机没有.Net并建议进行web下载。由于我可能在离线情况下安装应用程序,这对我来说不起作用。
以前有没有其他人尝试过在7zip SFX中包含.Net安装程序?如果有,他们是如何解决的?如果可能的话,我更愿意继续使用7zip,但如果有必要,我会研究其他工具。
问题是SFX在setup.exe完成后删除提取的文件。为了避免这种情况,您可以使用InstallPath参数:
;!@Install@!UTF-8!
Title="MyApp Installer"
ExecuteFile="setup.exe"
InstallPath="%temp%\My App"
;!@InstallEnd@!
但在这种情况下,提取的文件根本不会被删除。例如,您可以在MSI中删除这些文件。
PS。如果您的客户将通过远程桌面会话运行安装程序,您也必须考虑这个问题
我确定了一个我认为可以接受的解决方案。由于这个问题是由于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_APPsetup.exe
然后,此文件夹会在重新启动时持续存在,从而允许安装程序继续进行。正如serghei所指出的,从技术上讲,这是一个问题,因为它会一直持续到用户手动删除临时文件,但考虑到我的应用程序与现代硬盘驱动器