2009-12-03 6 views
11

Ich habe Probleme mit der Migration des verwalteten Codes von x86 auf x64-Plattform. Ich habe ein WiX-Projekt, um eine MSI zu erstellen, die über Bootstrapper ausgeführt wird.Plattform-Identifikation in WiX 3.0

Auf einer x86-Plattform werden Dateien in "Programme" wie in der Datei Project.wxs kopiert. Wenn jedoch dasselbe MSI auf einer x64-Plattform über Bootstrapper installiert wird, werden alle Installationsdateien standardmäßig in "Programme (x86)" kopiert, und die Funktionalität der Anwendung ist fehlgeschlagen, da die erforderlichen Dateien in der 12-Hierarchie-Hierarchie nicht gefunden wurden Programmdateien (für 64-bit ist es "C: \ Programme \ Gemeinsame Dateien \ Microsoft Shared \ Webserver-Erweiterungen \ 12 \ CONFIG").

Ich habe versucht, Preprozessor-Variablen wie <? If $ (var.ProcessorArchitecture) = x64?>, Aber ich muss diese Variable in der Projekt-Eigenschaft auf entweder x86 oder x64 fest codieren. Schließlich habe ich zwei verschiedene MSIs für zwei verschiedene Plattformen, was für mich keine wünschenswerte Lösung ist.

Also, durch WiX, ist es möglich, die Plattform zu identifizieren, um die Installation am gewünschten Ort zu gewährleisten?

Antwort

17

Ich glaube nicht, dass Sie in der Lage sein werden, ein einzelnes MSI zu haben, das beide Plattformen unterstützt. Sie müssen einen für x86 und einen weiteren x64 erstellen - die gute Nachricht ist, dass Sie kein anderes WiX-Projekt benötigen, um dies zu erreichen.

Der Weg, den ich in der Vergangenheit getan habe, ist am Anfang Ihrer Produktdefinition zu haben.

<?xml version="1.0" encoding="UTF-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 

    <?if $(var.Platform)=x64 ?> 
     <?define msiProductId = "102F7DF4-19A6-4d3d-987F-FF57A2031593" ?> 
     <?define win64Flag = "yes" ?> 
    <?else ?> 
     <?define msiProductId = "8AE46CAF-220F-4B9F-9527-D4A19A27C45B" ?> 
     <?define win64Flag = "no" ?> 
    <?endif ?> 

    <Product Id="$(var.msiProductId)" 
      Name="My Product" 
      Language="1033" 
      Version="1.0.0" 
      Manufacturer="Acme" 
      UpgradeCode="E2575E4A-A62E-4460-B96D-B722C79C8EAA"> 

     <Package InstallerVersion="400" 
       Compressed="yes" 
       InstallPrivileges="elevated" 
       Platform="$(var.Platform)" 
     /> 

     <!-- Rest of product definition goes here --> 

    </Product> 
</Wix> 

Ich vergesse, wo ich den Rat bekam, eine andere ProductID für jede Plattform zu verwenden.

Ich habe die Variable 'win64Flag' erstellt, damit andere WiX-Elemente in den plattformübergreifenden Szenarien gut funktionieren. Im Folgenden sehen Sie, wie Sie damit eine einzige RegistrySearch-Definition für beide Plattformen verwenden und das Problem lösen sollten, das beim Auffinden der 12-Stock-Hierarchie auftritt.

<Property Id="WSE12DIRECTORY"> 
    <RegistrySearch Id="Reg_WSE12DIRECTORY" 
        Type="raw" 
        Root="HKLM" 
        Key="SOFTWARE\Microsoft\Shared Tools\Web Server Extensions\12.0" 
        Name="Location" 
        Win64="$(var.win64Flag)" 
    /> 
</Property> 

Mit allen diesen an Ort und Stelle, ist es nur ein Fall von pre-processor variable den entsprechenden Wertes für die ‚Plattform‘ Weitergabe der Candle Befehlszeile oder die Zielplattform in Visual Studio auswählen.

+3

In WiX 3 wird von der Verwendung des Plattformattributs abgeraten.Sie empfehlen, es wegzulassen und stattdessen den Schalter "-arch" für Kerze zu verwenden. http://wix.sourceforge.net/manual-wix3/wix_xsd_package.htm – Chris

+0

Möglicherweise müssen Sie sys.BUILDARCH anstelle von var.Platform verwenden. –

11

Sie können die Condition-Anweisung (Dokumentation here) verwenden, die bei der Installation erkennt, auf welcher Plattform das Installationsprogramm ausgeführt wird. Dadurch können Sie nur ein Installationsprogramm erstellen, das auf allen Plattformen funktioniert.

Der Test für 64-Bit-Plattform ist VersionNT64 und umgekehrt ist der Test für nicht 64-Bit-Plattformen NOT VersionNT64.

Zum Beispiel:

<Component Id="SomeComponentId" Guid="SomeGuid"> 
    <Condition> 
     <![CDATA[NOT(VersionNT64)]]> 
    </Condition> 
    <File Id="SomeFile" Name="Somefile.exe" Source="$(var.UI.TargetDir)\ProjectOutput.exe" /> 
</Component> 
+2

Danke. Jetzt ist hier das andere Problem für WIX: Durch WIX, wenn ich den Installationspfad für eine 64-Bit-Komponenten durch Zugriff auf seine Registrierungsschlüssel abholen, wegen der Umleitung der Registrierung wird es an WOW6432node umgeleitet, wo Registrierungsschlüssel nicht vorhanden ist. Gibt es also über WIX eine Möglichkeit, in die 64-Bit-Registrierungsansicht mit nur einer einzigen MSI-Erstellung zu schauen? Soweit ich weiß, muss eine Komponente als Win64 = "Ja" markiert werden, um Registrierungseinträge unter der 64-Bit-Registrierungsstruktur anstelle der WOW64-Registrierungsstruktur zu schreiben. Irgendwelche anderen Vorschläge? – user223572

+0

Dieses Problem wird in der Lösung behoben, die ich in meiner Antwort angeboten habe. – JamesD

+0

@PeterMortensen. Ja. Fest. – eh9

2

können Sie verwenden

candle -arch x86 

oder

candle -arch x64 

und als Folge die Platform="x64" und Win64="true" Attribute generiert werden.