2009-12-16 15 views
7

MyApp versión 1.0 contenía el archivo foo.dll. La versión de este archivo era la versión 10.5.567. Ahora MyApp es la versión 2.0 y la versión de foo.dll es 2.0.123. La versión es más BAJA que la versión anterior. El proveedor que escribió este dll decidió ir hacia atrás con el número de versión del archivo. Esta no es una decisión que pueda cambiar.Instale un archivo independientemente del número de versión con WiX

¿Cómo consigo que WiX siempre instale este archivo?

La acción RemoveExistingProducts está programada después de la acción InstallFinalize y tampoco se puede cambiar.

InstallShield tenía un indicador de "sobrescribir siempre", pero no creo que pueda imitar esto sin cambiar el comportamiento de todos los archivos mediante un interruptor de compilación. No quiero esto. Solo quiero actualizar ESTE archivo.

también he intentado

<RemoveFile Id="foo.dll" On="install" Name="foo.dll" /> 

Pero esto no funcionaba bien. Termino recibiendo 'Error 2753 El archivo foo.dll no está marcado para la instalación' más adelante.

Respuesta

3

Esto no es fácil porque va en contra del comportamiento estándar de los paquetes MSI. Al compilar, debe establecer supress-file-options con -sf en light.exe. Entonces no hay información de archivo de tus archivos leídos. Puede establecer DefaultVersion esta versión se utilizará. También he usado RemoveFile en una solución, pero puedo decir que funciona. Lo he agregado en el mismo componente donde agrego el archivo.

<Component> 
     <File DiskId="1" Id="fooDLL" Name="foo.dll" Vital="yes" 
     DefaultVersion="$(var.MAJORVERSION).$(var.MINORVERSION).$(var.BUILDVERSION)" 
     DefaultLanguage="0"></File> 
     <RemoveFile Id='RemoveOldDLL' On='install' Name='foo.dll'/> 
    </Componente> 

Esto no es una manera limpia, pero para eliminar una versión anterior funciona para mí.

+0

Havent lo intentó, pero parece posible. Ver mi respuesta en este hilo para un enlace a una lista de diferentes enfoques. –

+0

Intenté usar DefaultVersion para instalar un archivo .MDE y funcionó bien cuando instalé el parche, el archivo se sobrescribió correctamente. El único problema era que el parche no se desinstalaba. El registro de instalación decía "Nuevo archivo versionado - archivo existente no versionado", y la desinstalación solicitó los medios originales. Todavía no he resuelto esto, así que cualquier sugerencia sería bienvenida. – Dave

1

Me respondió una pregunta similar hace un tiempo: Forcing an upgrade of a file that is modified during its initial installation

Creo que me gustaría utilizar un archivo complementario para resolver este problema, pero puede obtener errores de validación ya que el archivo en cuestión es una DLL y por lo tanto considera una ejecutable. Creo que todavía funcionaría, y de manera confiable.

-1

Una cosa que podría valer la pena probar es establecer RemoveExistingProducts real al principio de la secuencia. El MSI debería eliminar primero el programa anterior y luego instalar la actualización. Esto resolverá tu problema. p.ej.

<InstallExecuteSequence> 
    <RemoveExistingProducts After="CostFinalize" /> 
</InstallExecuteSequence> 
+0

Lamentablemente, tiene que suceder * antes de * CostFinalize (porque CostFinalize es el paso donde MSI evalúa qué archivos actualizar) y, por lo que puedo decir, RemoveExistingProducts no puede secuenciarse tan temprano. Si encuentras una forma de evitarlo, me encantaría saber de eso. :) – jalf

1

anotación

Fuerza siempre sobrescribir en la producción Light.exe con el "InstallShield truco":

XPath = "/ wixOutput/tabla [name = 'Archivo' @]/fila/campo [5] "InnerText =" 65535.0.0.0 "

Cuestiones relacionadas