2009-12-03 8 views
11

管理対象コードをx86から​​x64プラットフォームに移行する際に問題が発生しています。私はMSIを作成するためのWiXプロジェクトを持っており、これはBootstrapperを通して実行されます。WiX 3.0のプラットフォームID

x86プラットフォームでは、ファイルはProject.wxsファイルごとに "Program Files"にコピーされます。しかし、同じMSIがBootstrapperを介してx64プラットフォームにインストールされている場合、すべてのインストールファイルはデフォルトで "Program Files(x86)"にコピーされ、アプリケーションの機能は12ヒープ階層で必要なファイルが見つからないため失敗します。プログラムファイル(64ビットの場合は「C:¥Program Files¥Common Files¥Microsoft Shared¥Webサーバー拡張¥12¥CONFIG」)。

$(var.ProcessorArchitecture)= x64?>の場合、<のようなプリプロセッサ変数を使用しようとしましたが、プロジェクトプロパティでこの変数をx86またはx64にハードコードする必要があります。最後に、2つの異なるプラットフォーム用の2つの異なるMSIで終わりますが、これは私には望ましい解決策ではありません。

WiXを通じて、プラットフォームを特定して希望の場所に確実に設置できるかどうかを確認してください。

答えて

17

両方のプラットフォームをサポートする単一のMSIを持つことはできません。 x86と別のx64用に作成する必要があります。これを実現するために別のWiXプロジェクトを保守する必要はありません。

これまで私が行ってきたことは、製品定義の冒頭に次のように書かれていることです。

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

プラットフォームごとに異なるProductIDを使用するアドバイスがどこにあるのか忘れています。

私は 'win64Flag'変数を作成して、クロスプラットフォームシナリオで他のWiX要素がうまく動作するようにしました。例として、両方のプラットフォームで1つのRegistrySearch定義を動作させるために使用する方法と、12-hive階層の特定に伴う問題を解決する方法があります。すべてこれにより

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

代わりに、それはCandleコマンドラインの「プラットフォーム」プリプロセッサ変数に関連する値を渡し、またはVisual Studioでターゲットプラットフォームを選択した場合だけです。

+3

WiX 3では、プラットフォーム属性の使用はお勧めしません。彼らはそれを残して、キャンドルの代わりに '-arch'スイッチを使うことを勧めます。 http://wix.sourceforge.net/manual-wix3/wix_xsd_package.htm – Chris

+0

var.Platformではなくsys.BUILDARCHを使用する必要があります。 –

11

インストール時にインストーラが実行されているプラ​​ットフォームを検出する条件文(ドキュメントhere)を使用できます。これにより、すべてのプラットフォームで動作するインストーラを1つだけ作成できます。

64ビットプラットフォームのテストはVersionNT64で、逆に64ビット以外のプラットフォームのテストはNOT VersionNT64です。例えば

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

ありがとうございます。 WIXでは、レジストリキーにアクセスして64ビットコンポーネントのインストールパスを取得すると、レジストリリダイレクトによってレジストリキーが存在しないWOW6432ノードにリダイレクトされます。したがって、WIXを通じて、単一のMSI作成のみで64ビットレジストリビューを調べる方法はありますか? 私が知る限り、WOW64レジストリハイブの代わりに64ビットレジストリハイブの下にレジストリエントリが書き込まれるようにするには、Win64 = "yes"とマークする必要があります。 他の提案はありますか? – user223572

+0

この問題は、私の答えで提供されたソリューションで対処されています。 – JamesD

+0

@PeterMortensen。はい。一定。 – eh9

2

あなたは

candle -arch x86 

または

candle -arch x64 

Platform="x64"Win64="true"属性が生成される結果を使用することができます。