2009-12-16 14 views
7

MyApp Version 1.0 enthielt die Datei foo.dll. Die Version dieser Datei war Version 10.5.567. Jetzt ist MyApp Version 2.0 und die Version von foo.dll ist 2.0.123. Die Version ist niedriger als die alte Version. Der Anbieter, der diese DLL geschrieben hat, entschied sich für die Versionsnummer der Datei. Dies ist keine Entscheidung, die ich ändern kann.Installieren Sie eine Datei unabhängig von der Versionsnummer mit WiX

Wie bekomme ich WiX immer diese Datei zu installieren?

Die Aktion RemoveExistingProducts wird nach der Aktion InstallFinalize geplant und kann auch nicht geändert werden.

InstallShield hatte ein 'immer überschreiben' Flag, aber ich glaube nicht, dass ich dies nachahmen kann, ohne das Verhalten aller Dateien über einen Compiler-Switch zu ändern. Ich will das nicht. Ich möchte nur DIESE Datei aktualisieren.

Ich habe auch versucht,

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

Aber das hat nicht funktioniert entweder. Ich bekomme am Ende 'Error 2753 Die Datei foo.dll ist nicht für die Installation markiert' später.

Antwort

3

Dies ist nicht einfach, weil es gegen das Standardverhalten von MSI-Paketen ist. Beim Kompilieren müssen Sie die Option supress-file-options in der Datei light.exe mit -sf einstellen. Dann werden keine Dateiinformationen von Ihren Dateien gelesen. Sie können DefaultVersion festlegen, diese Version wird verwendet. Ich habe auch RemoveFile in einer Lösung verwendet, aber ich kann sagen, dass es funktioniert. Ich habe es in derselben Komponente hinzufügen, wo ich die Datei hinzufügen.

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

Dies ist kein sauberer Weg, aber eine alte Version zu entfernen, funktioniert es für mich.

+0

Havent versuchte dies, sieht aber möglich aus. Siehe meine Antwort in diesem Thread für einen Link zu einer Liste verschiedener Ansätze. –

+0

Ich habe versucht, DefaultVersion zu verwenden, um eine .MDE-Datei zu installieren, und es funktionierte gut, als ich den Patch installierte, wurde die Datei korrekt überschrieben. Das einzige Problem war, dass der Patch nicht deinstalliert werden würde. Im Installationsprotokoll wurde "Neue Datei versioniert - vorhandene Datei nicht versioniert" und die Deinstallation für das ursprüngliche Medium genannt. Ich habe das immer noch nicht gelöst, daher wären irgendwelche Vorschläge willkommen. – Dave

1

antwortete ich eine ähnliche Frage eine Weile zurück: Forcing an upgrade of a file that is modified during its initial installation

Ich denke, dass ich eine Begleitdatei verwenden würde, dieses Problem zu lösen, aber Sie könnten Validierungsfehler erhalten, da die betreffende Datei eine DLL ist und betrachtet daher ein ausführbar. Ich glaube, es würde immer noch und zuverlässig funktionieren.

-1

Eine Sache, die einen Versuch wert wäre, ist RemoveExistingProducts wirklich früh in der Sequenz zu setzen. Das MSI sollte dann zuerst das alte Programm entfernen und dann das Upgrade installieren. Dies wird Ihr Problem lösen. z.B.

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

Leider muss es geschehen * vor * CostFinalize (weil CostFinalize der Schritt ist, bei dem MSI auswertet, welche Dateien zu aktualisieren sind) - und soweit ich das beurteilen kann, darf RemoveExistingProducts nicht so früh sequenziert werden. Wenn Sie einen Weg finden, würde ich gerne davon hören. :) – jalf

1

Annotation

Kraft überschreibt immer in Light.exe Ausgabe mit dem "Install Trick":

XPath = "/ wixOutput/table [@ name = 'Datei']/Zeile/Feld [5] "InnerText =" 65535.0.0.0 "

Verwandte Themen