14

マネージ コードを x86 から x64 プラットフォームに移行するときに問題に直面しています。Bootstrapper を介して実行されるMSIを作成する WiX プロジェクトがあります。

x86 プラットフォームでは、ファイルは Project.wxs ファイルに従って「Program Files」にコピーされます。ただし、Bootstrapper を使用して同じ MSI を x64 プラットフォームにインストールすると、デフォルトですべてのインストール ファイルが「Program Files (x86)」にコピーされ、12 ハイブ階層で必要なファイルが見つからなかったため、アプリケーションの機能が失敗しました。 Program Files (64 ビットの場合、「C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\CONFIG」)。

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

では、WiX を介してプラットフォームを特定し、目的の場所に確実にインストールすることは可能でしょうか?

4

3 に答える 3

20

単一の MSI で両方のプラットフォームをサポートできるとは思えません。x86 用に 1 つ、x64 用にもう 1 つ作成する必要があります。幸いなことに、これを実現するために別の 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 要素がクロスプラットフォーム シナリオで適切に機能するようにしました。例として、これを使用して単一の RegistrySearch 定義を両方のプラットフォームで機能させ、12 ハイブ階層の検索で発生している問題を解決する方法を次に示します。

<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コマンドラインで「Platform」プリプロセッサ変数に関連する値を渡すか、Visual Studio でターゲット プラットフォームを選択するだけです。

于 2009-12-07T14:03:06.773 に答える
13

インストール時にインストーラーが実行されているプラ​​ットフォームを検出するCondition ステートメント (ドキュメントはこちら) を使用できます。これにより、すべてのプラットフォームで動作するインストーラーを 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>
于 2009-12-31T02:25:48.560 に答える
2

使用できます

candle -arch x86 

また

candle -arch x64 

その結果、Platform="x64"およびWin64="true"属性が生成されます。

于 2012-08-23T10:53:59.407 に答える