2009-11-25 19 views
7

Tengo un instalador de WiX que necesita instalar nuevos bits para Interop.FOOBARLib.DLL en el GAC. El problema es que el número de versión es el mismo que la versión anterior y los nuevos bits no se escriben en el GAC en una actualización. Ejecutamos la acción RemoveExistingProducts después de la acción InstallFinalize.Forzar instalador para actualizar un archivo en el GAC independientemente del número de versión

No podemos mover la acción RemoveExistingProducts a principios de la instalación.

El componente foobar.dll no es mi componente, así que no puedo incrementar la versión de la biblioteca de tipos (lo que provocaría que la versión de la interoperación se incrementara y todos estos problemas desaparecieran).

¿Hay alguna manera de FORZAR que el archivo se actualice en el GAC, incluso si la versión es la misma? Quiero un comportamiento similar a "gacutil.exe/f".

El componente se parece a:

<Component Id="Interop.FOOBARLib.dll" Guid="{4E0C173E-34DF-4249-A3A6-5530047FA65B}" > 
    <File Id="Interop. FOOBARLib.dll" Name="Interop.FOOBARLib.dll" KeyPath="yes" Assembly=".net"/> 
</Component> 

Respuesta

1

Puede regenerar el ensamblado de interoperabilidad sí mismo y la fuerza para obtener una versión más alta de esta manera:

tlbimp /asmversion:1.2.3 /out:Interop.FOOBARLib.DLL foobar.dll 
+0

Se trata de cómo lo resolví. También se requiere el/sysarray param. – Mike

-1

Se podría tratar de ejecutar una acción personalizada para borrar el archivo, justo antes de que se instalen los componentes. Es not recommended to use vbscript for custom actions pero el ejemplo a continuación todavía debe ilustrar la idea.

<CustomAction Id="ForceRemove" Script="vbscript" Execute="deferred"> 
    <![CDATA[ 
    Dim fso 
    Set fso = CreateObject("Scripting.FileSystemObject") 
    fso.DeleteFile("c:\somefile.dll") 
    ]]> 
</CustomAction> 

<InstallExecuteSequence> 
    <Custom Action='ForceRemove' Before='InstallFiles'/> 
</InstallExecuteSequence> 
8

Lo que estamos tratando de hacer que se denomina una actualización en contexto de una Asamblea en el GAC. Para que esto funcione correctamente, las dos bibliotecas Interop.FOOBARLib.dll deben tener la misma versión de ensamblado, pero la versión más nueva debe tener una versión de archivo superior. El atributo de versión de archivo debe incluirse en la nueva tabla MsiAssemblyName de MSI. Wix no incluir este atributo por defecto, así que hay que añadir el siguiente parámetro en el archivo de .wixproj:

<SetMsiAssemblyNameFileVersion>True</SetMsiAssemblyNameFileVersion> 

Consulte también:

In-place updating using Wix

Cuestiones relacionadas