2012-07-12 33 views
5

Estoy tratando de crear un archivo autoextraíble para una aplicación de Windows que he escrito. Mi aplicación usa la última versión de .Net 4.0, y quiero incluir la configuración de .Net en el instalador de SFX. Sin embargo, si la computadora necesita instalar .Net framework y reiniciar, no continuará correctamente la instalación de mi aplicación. Miré a través de las otras publicaciones sfx en los sitios de Stack, pero ninguno de ellos son problemas que impliquen un instalador .Net como un requisito previo para la aplicación.7zip Self Extracting Archive (SFX) and .Net Installer

Mi proyecto produce 4 archivos: "App Installer.msi" "setup.exe" "WindowsInstaller-KB893803-v2-x86.exe" (en la carpeta "WindowsInstaller3_1") y "dotNetFx40_Client_x86_x64.exe" (en la carpeta "DotNetFX40Client"), todos los cuales creo que son estándar.

Yo uso 7zip para crear el SFX de la siguiente manera:

primer lugar, utilizar 7zip para comprimir todos los archivos en un solo archivo:

7z.exe a -r AppInstallFiles.7z * 

A continuación, hago una copia binaria con los 7zS archivo .sfx (utilizado para crear un instalador autoextraíble), mi archivo de configuración y el archivo. El archivo de configuración es la siguiente:

;[email protected]@!UTF-8! 
Title="MyApp Installer" 
ExecuteFile="setup.exe" 
;[email protected]@! 

Y copiarlos con la línea:

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

el instalador funciona perfectamente en ordenadores que ya tienen .Net 4.0 Mi problema surge en los ordenadores que no lo hacen tener .Net Framework - Ejecuto el SFX, extrae todo en un directorio temporal. Luego, cuando setup.exe reconoce que la computadora no tiene .Net 4.0, llama al .Net Installer. Esto se extrae a su propio directorio temporal y comienza la instalación. Al finalizar, solicita un reinicio. Al presionar "No" sale de la instalación completa. Al presionar "Sí" se reinicia la máquina, y al iniciar sesión aparece un error: "Se produjo un error al intentar instalar MyApp" con detalles de "No se puede localizar el archivo de la aplicación '. Installer.msi'

Parece que la El problema es que cuando el instalador pasa al instalador .Net y el instalador .Net se reinicia, se elimina el directorio temporal que contiene los archivos de instalación de Mi Aplicación. He intentado cambiar de setup.exe a usar "App Installer.msi". sin embargo, esto simplemente lleva al msi a informar que la computadora no tiene .Net y sugiere una descarga en la web. Como puedo instalar la aplicación en situaciones fuera de línea, esto no funcionará para mí.

¿Alguien más ha intentado? para incluir el instalador .Net antes en un 7zip SFX, y si es así, ¿cómo lo resolvieron? Preferiría sigue usando 7zip si es posible, pero buscará otras herramientas si es necesario.

+0

Entonces, como solución temporal, he creado un secuencia de comandos por lotes que llama a las dos actualizaciones (WindowsInstaller y dotNetFx40_Client_x86_x64) con el indicador/norestart. Esto no es ideal, porque a) este método no omite automáticamente el paso del instalador de .Net si ya está instalado, yb) no puedo pasar un mensaje que informa al usuario que debe reiniciarse antes de usar la aplicación. También crea una ventana de cmd, que preferiblemente se evitaría. –

Respuesta

2

El problema es que el SFX elimina los archivos extraídos después de que finalice setup.exe. Para evitar esto se puede usar el parámetro InstallPath:

;[email protected]@!UTF-8! 
Title="MyApp Installer" 
ExecuteFile="setup.exe" 
InstallPath="%temp%\\My App" 
;[email protected]@! 

pero en este caso los archivos extraídos no se eliminarán en absoluto. Podría eliminar estos archivos en su MSI, por ejemplo.

PS. Si sus clientes ejecutarán el instalador a través de una sesión de Escritorio remoto, también ha considerado this issue

+0

En realidad, 7zip 9.20 no tiene esta bandera, aunque la he visto mencionar en varios lugares (ver http://sourceforge.net/projects/sevenzip/forums/forum/45798/topic/4626250 - del creador, "7-Zip SFX no admite la variable" InstallPath "y, a partir de la documentación, los únicos parámetros son Title, BeginPrompt, Progress, RunProgram, Directory, ExecuteFile y ExecuteParameters. Terminé haciendo algo similar: ver mi respuesta a continuación. –

+0

Además, gracias por el aviso sobre el escritorio remoto, pero no es un problema para mí. También parece que podría extraerlo al directorio (supuesto) de la aplicación en los archivos de programa para evitarlo. Sin embargo, eso podría ser irritante para un usuario que instala la aplicación en otro lugar y no espera que exista la carpeta% programfiles% \ MYAPP. –

+2

Usamos el 7zip SFX modificado desde http://7zsfx.info/en/. Es compatible con InstallPath y muchos otros parámetros –

2

Me decidí por una solución que encontré bastante aceptable. Como el problema se produce al eliminar la carpeta sfx temp en el reinicio, ejecuto un archivo por lotes en lugar de setup.exe.El archivo por lotes mueve copia todo en el directorio temporal a un nuevo directorio en la temperatura, y llama a la configuración de allí:

::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 

Esta carpeta se persiste en el reinicio, lo que permite la instalación para continuar. Como señala serghei, eso técnicamente es un problema, porque dura hasta que el usuario borre manualmente los archivos temporales, pero es aceptable dado el tamaño de mi aplicación en comparación con los discos duros modernos

+0

Esto funcionó para mí – Sugrue