visual tutorial studio prime create installer wix windows-installer

installer - tutorial - wix visual studio 2012



¿Cómo puedo arreglar la lógica de actualización de una configuración de wix después de cambiar InstallScope a "perMachine"? (4)

Lamentablemente, Windows Installer no es compatible. Algunos procesos fuera de su paquete (¿un programador / chainer?) Tendrán que gestionar la actualización de usuario por equipo.

Usamos wix para crear configuraciones para nuestra aplicación. Para el caso en el que el usuario ya ha instalado una versión anterior de nuestra aplicación, realizamos una actualización importante con el elemento XML de MajorUpgrade . Todo esto funciona como se desea: si se instala una versión anterior, se actualiza de forma transparente. Si hay una versión más reciente, el instalador cancela con un mensaje claro.

Sin embargo, ahora quiero cambiar el InstallScope de "perUser" a "perMachine". Desafortunadamente esto rompe la lógica de actualización. El nuevo instalador no parece detectar y eliminar la instalación previa "perUser". En cambio, simplemente se instala encima de la versión anterior en la misma ubicación de ProgramFiles. El usuario puede ver dos entradas en la lista "agregar / eliminar programas" y ve dos accesos directos idénticos en el escritorio (el antiguo específico del usuario y el nuevo perMachine).

¿Cómo hago la transición de mi instalador del ámbito de instalación "perUser" al de "perMachine" sin romper la lógica de actualización?



Comenzando con la configuración por máquina.

<Property Id="ALLUSERS" Value="1" />

Esto ejecutará una verificación automática por máquina (si tiene el elemento MajorUpgrade funcionando, supongo), que no recoge la instalación anterior por usuario:

Action start 15:46:35: FindRelatedProducts. MSI (c) (D0:0C) [15:46:35:496]: FindRelatedProducts: current install is per-machine. Related install for product ''{0C6604FB-58EC-48B9-8259-5871EFDADEB9}'' is per-user. Skipping... MSI (c) (D0:0C) [15:46:35:496]: FindRelatedProducts: current install is per-machine. Related install for product ''{0C6604FB-58EC-48B9-8259-5871EFDADEB9}'' is per-user. Skipping...

Por lo tanto, antes de la instalación, asegúrese de ejecutar otra llamada a FindRelatedProducts para los productos que se han instalado en el alcance del usuario (por ejemplo, de esta manera):

<!-- temporarily switch to per-user install scope--> <Publish Dialog="MyWelcomeDlg" Control="Next" Property="ALLUSERS" Value="{}">1</Publish> <!-- find related products that have been installed per-user --> <Publish Dialog="MyWelcomeDlg" Control="Next" Event="DoAction" Value="FindRelatedProducts">1</Publish> <!-- switch back to per-machine install scope--> <Publish Dialog="MyWelcomeDlg" Control="Next" Property="ALLUSERS" Value="1">1</Publish>

Esto a su vez encuentra la instalación por usuario:

Action start 15:46:36: FindRelatedProducts. FindRelatedProducts: Found application: {0C6604FB-58EC-48B9-8259-5871EFDADEB9} MSI (c) (D0:88) [15:46:36:716]: PROPERTY CHANGE: Adding WIX_UPGRADE_DETECTED property. Its value is ''{0C6604FB-58EC-48B9-8259-5871EFDADEB9}''. MSI (c) (D0:88) [15:46:36:716]: PROPERTY CHANGE: Adding MIGRATE property. Its value is ''{0C6604FB-58EC-48B9-8259-5871EFDADEB9}''.

Los productos existentes se eliminarán sin importar en qué cheque se encuentren.

Action start 15:46:41: RemoveExistingProducts. RemoveExistingProducts: Application: {0C6604FB-58EC-48B9-8259-5871EFDADEB9}

En una nota al margen : Esto no evita una dificultad básica que surge cuando tienes instaladores de doble propósito: el Usuario1 en la máquina puede instalarse en el alcance por usuario, luego el Usuario2 se instala por máquina. El Usuario1 verá ambas instalaciones en su tabla de programas / características, y no sé cuál tiene prioridad. Por lo tanto, considere ir solo con instalaciones por máquina.


Esto encuentra las instalaciones existentes perUser y / o perMachine. Y obliga a la nueva instalación a una instalación de perMachine (obviamente lógica para hacer que ese condicional se pueda aplicar como lo desee). Esto funciona cuando se ejecuta como una instalación ordinaria y cuando se instala silenciosamente en LocalSystem (actualizaciones silenciosas). Tenga en cuenta que solo puede encontrar una instalación perUser cuando se ejecuta como ese usuario.

Crear una acción personalizada (en DLL)

#pragma comment(linker, "/EXPORT:RunFindRelatedProducts=_RunFindRelatedProducts@4") extern "C" __declspec(dllexport) UINT __stdcall RunFindRelatedProducts(MSIHANDLE a_hInstall) { MsiSetProperty(a_hInstall, "ALLUSERS", "1"); MsiDoAction(a_hInstall, "FindRelatedProducts"); MsiSetProperty(a_hInstall, "ALLUSERS", ""); MsiDoAction(a_hInstall, "FindRelatedProducts"); MsiSetProperty(a_hInstall, "ALLUSERS", "1"); return ERROR_SUCCESS; }//end function

Luego, "reemplace" los FindRelatedProducts estándar con la acción personalizada

<InstallUISequence> <FindRelatedProducts>0</FindRelatedProducts> <Custom Action="RunFindRelatedProducts" Before=''FindRelatedProducts''>NOT Installed</Custom> </InstallUISequence> <InstallExecuteSequence> <FindRelatedProducts>0</FindRelatedProducts> <Custom Action="RunFindRelatedProducts" Before=''FindRelatedProducts''>NOT Installed</Custom> </InstallExecuteSequence>