Самораспаковывающийся архив 7zip (SFX) и установщик .Net

Я пытаюсь создать самораспаковывающийся архив для приложения Windows, которое я написал. В моем приложении используется последняя версия .Net 4.0, и я хочу включить настройку .Net в установщик SFX. Однако, если компьютеру необходимо установить .Net framework и перезагрузиться, он не возобновит установку моего приложения должным образом. Я просмотрел другие сообщения о sfx на сайтах Stack, но ни в одном из них нет проблем, связанных с установщиком .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, и предлагает загрузку из Интернета. Поскольку я могу устанавливать приложение в автономном режиме, это не сработает для меня.

Кто-нибудь еще пытался включить установщик .Net раньше в 7zip SFX, и если да, то как они это решили? Я бы предпочел продолжать использовать 7zip, если это возможно, но при необходимости рассмотрю другие инструменты.


person L.J.    schedule 12.07.2012    source источник
comment
Итак, в качестве временного решения я создал пакетный скрипт, который вызывает два обновления (WindowsInstaller и dotNetFx40_Client_x86_x64) с флагом /norestart. Это не идеально, потому что а) этот метод не пропускает автоматически шаг установщика .Net, если он уже установлен, и б) я не могу передать сообщение, информирующее пользователя о перезагрузке перед использованием приложения. Он также создает окно cmd, которого желательно избегать.   -  person L.J.    schedule 13.07.2012


Ответы (2)


Проблема в том, что SFX удаляет извлеченные файлы после завершения setup.exe. Чтобы избежать этого, вы можете использовать параметр InstallPath:

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

Но в этом случае извлеченные файлы вообще не будут удалены. Например, вы можете удалить эти файлы в своем MSI.

PS. Если ваши клиенты будут запускать установщик через сеанс удаленного рабочего стола, вы также должны рассмотреть эта проблема

person Serghei Gorodetki    schedule 13.07.2012
comment
На самом деле, 7zip 9.20 не имеет этого флага, хотя я видел его упоминание в нескольких местах (см. sourceforge.net/projects/sevenzip/forums/forum/45798/topic/ - от создателя, 7-Zip SFX не поддерживает переменную InstallPath и из документации только параметры являются Title, BeginPrompt, Progress, RunProgram, Directory, ExecuteFile и ExecuteParameters.В итоге я сделал что-то подобное — см. мой ответ ниже. - person L.J.; 13.07.2012
comment
Кроме того, спасибо за внимание к проблеме с удаленным рабочим столом, но для меня это не проблема. Также кажется, что я мог бы извлечь в (предполагаемый) каталог приложения в программных файлах, чтобы избежать этого. однако это может раздражать пользователя, который устанавливает приложение в другом месте и не ожидает, что папка %programfiles%\MYAPP существует. - person L.J.; 13.07.2012
comment
Мы используем модифицированный звуковой эффект 7zip с сайта 7zsfx.info/en. Он поддерживает InstallPath и многие другие параметры. - person Serghei Gorodetki; 17.07.2012
comment
В журнале изменений ссылки @Serghei указано, что последнее редактирование пакета было в 2007 году. - person AnneTheAgile; 01.02.2015

Я остановился на решении, которое нашел вполне приемлемым. Поскольку проблема возникает из-за того, что временная папка sfx удаляет себя при перезагрузке, я запускаю пакетный файл, а не 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

Затем эта папка сохраняется при перезагрузке, что позволяет продолжить установку. Как отмечает Сергей, технически это проблема, потому что она длится до тех пор, пока пользователь вручную не удалит временные файлы, но это приемлемо, учитывая размер моего приложения по сравнению с современными жесткими дисками.

person L.J.    schedule 13.07.2012