WIX 如何知道它安装的是 32 位还是 64 位软件?

How does WIX know if it's installing 32 or 64 Bit software?

我有一个 WIX 安装程序,可以创建一些注册表项并安装一些软件。我不使用 package-elements 属性 "Platform",也不使用 candle.exe-arch 开关。

我弄明白了为什么它将软件复制到 C:\Program Files (x86)\Vendor\Product 而不是 C:\Program Files\Vendor\Product:显然,使用 ProgramFilesFolder 会自动重定向到 32 位软件路径:

<Directory Id="TARGETDIR" Name="SourceDir">
    <Directory Id="ProgramFilesFolder"> <!-- 64 Bit Folder would be "ProgramFiles64Folder" -->
        <Directory Id="Vendor" Name="Vendor">
            <Directory Id="INSTALLDIR" Name="Product">

但是我找不到类似的注册表项。 为什么 WIX 将注册表项从 Software\Vendor\Product 重定向到 Software\WOW6432Node\Vendor\Product? 为什么 WIX 认为我安装了 32 位软件,而我没有?

示例:此代码在 Software\WOW6432Node\Apache Software Foundation\Procrun 2.0\...

中创建注册表项
<RegistryKey Root="HKLM"
    Key="Software\Apache Software Foundation\Procrun 2.0$(var.serviceName)\Parameters"
    ForceDeleteOnUninstall="yes">
    <RegistryValue Key="Java" Name="Classpath" Type="string" Value="[JettyHomeDirectory]start.jar"/>
如果省略 Platform 属性和 -arch 开关,则

x86(32 位)是默认值。一旦 MSI 被编译,它将使用 32 位位置,而不管您的文件被编译成什么。它不知道你的文件里有什么。

我不从命令行执行 candle/light,我使用 Visual Studio 集成 (Votive) / MSBuild。在这种情况下,解决方案配置管理器及其 solution/project x86(默认)和 x64 平台会自动驱动 -arch 开关。

因为 .NET 应用程序会 JIT 任何 CPU 而不管它安装到哪里,我很少创建特定于 x64 的安装程序,所以在大多数情况下我忽略了这一点。有时,我需要安装 and/or 将非托管组件注册到 SystemFolder 然后我会关心。

您需要 1) 像我在 visual studio 中做的那样 2) 在构建期间传递 -arch 属性 或 3) 将 Package 属性设置为 x64 并忽略 'this is discouraged' 评论。