如何制作64位MSI? [英] How do I make a 64 bit MSI?

查看:131
本文介绍了如何制作64位MSI?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已指定:

    运行candle.exe
  • -arch x64.
  • Package上的
  • Platform=x64.
  • ProgramFiles64Folder作为安装内容的Directory id.
  • -arch x64 when running candle.exe.
  • Platform=x64 on the Package.
  • ProgramFiles64Folder as the Directory id where things get installed.

并且仍然在安装应用程序后转到C:\Program Files (x86).

and still, when the app gets installed, it goes to C:\Program Files (x86).

heat.exe生成的其他一些wxs.我尝试将-platform x64-platform win64添加到对heat.exe的调用中,但这没什么区别.

There are some other wxs generated by heat.exe. I tried adding -platform x64 and -platform win64 to the calls to heat.exe, but it made no difference.

我读

  • https://msdn.microsoft.com/en-us/library/gg513929.aspx
  • The section on 64 bit installer in the Wix Cookbook
  • How do I get WiX to generate a 64-bit MSI?

我想我正在做在那里描述的所有事情.

and I think I'm doing everything that was described there.

我想念什么?

我提出了一个最小的情况,看起来像这样:

I've came up with a minimum case that looks like this:

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Product Id="*" Name="Project X" Manufacturer="X LLC" Language="1033" Version="1.0.0.0"
             UpgradeCode="5bf2131c-4068-4cb3-adac-bc9c79ed8ce3">
        <Package InstallerVersion="301" Compressed="yes" InstallScope="perMachine" Platform="x64"/>
        <Property Id="ApplicationFolderName" Value="Project X"/>
        <Property Id="WixAppFolder" Value="WixPerMachineFolder"/>
        <UI>
            <UIRef Id="WixUI_Advanced"/>
        </UI>
    </Product>
</Wix>

我这样编译它:

 candle.exe -arch x64 -ext WixUIExtension -ext WixUtilExtension ProjectX.wxs

 light.exe -ext WixUIExtension -ext WixUtilExtension -out ProjectX-1.0.0-beta.3-win64.msi ProjectX.wixobj

它显然抱怨媒体表为空:

It obviously complaints about the media table being empty:

> candle.exe -arch x64 -ext WixUIExtension -ext WixUtilExtension ProjectX.wxs
Windows Installer XML Toolset Compiler version 3.11.0.1701
Copyright (c) .NET Foundation and contributors. All rights reserved.

ProjectX.wxs

> light.exe -ext WixUIExtension -ext WixUtilExtension -out ProjectX-1.0.0-beta.3-win64.msi ProjectX.wixobj
Windows Installer XML Toolset Linker version 3.11.0.1701
Copyright (c) .NET Foundation and contributors. All rights reserved.

C:\Users\pupeno\AppData\Local\Temp\h1k0echv\ProjectX-1.0.0-beta.3-win64.msi : warning LGHT1076 : ICE71: The Media table has no entries.

但是仍然会生成安装程序,它仍然指向C:\Program Files (x86):

But the installer is still generated and it still points to C:\Program Files (x86):

完整的.wxs看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
     xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
    <Product Id="*" Name="ProjectX" Manufacturer="X Inc" Language="1033"
             Version="$(var.MSIProductVersion)" UpgradeCode="">
        <Package InstallerVersion="301" Compressed="yes" InstallScope="perMachine" Platform="x64"/>

        <MediaTemplate EmbedCab="yes"/>

        <Icon Id="Icon_ProjectX.ico" SourceFile="src\main\installer\ProjectX.ico"/>

        <WixVariable Id="WixUISupportPerUser" Value="0"/>
        <Property Id="ApplicationFolderName" Value="X Inc\ProjectX"/>
        <Property Id="WixAppFolder" Value="WixPerMachineFolder"/>
        <Property Id="ARPPRODUCTICON" Value="Icon_ProjectX.ico"/>
        <WixVariable Id="WixUILicenseRtf" Value="src\main\installer\eula.rtf"/>
        <WixVariable Id="WixUIBannerBmp" Value="src\main\installer\WixUIBannerBmp.bmp"/>
        <WixVariable Id="WixUIDialogBmp" Value="src\main\installer\WixUIDialogBmp.bmp"/>
        <Property Id="AUTO_CONNECT_TO">
            <RegistrySearch Id="AutoConnectTo" Root="HKLM" Key="Software\X Inc\ProjectX" Name="AutoConnectTo"
                            Type="raw"/>
        </Property>
        <Property Id="RUN_ProjectX_ON_EXIT" Value="true"/>
        <Property Id="INSTALL_SCREENSAVER_ON_EXIT" Value="true"/>
        <Property Id="STAGING_DIR" Value="undefined"/>
        <Property Id="ARCH" Value="undefined"/>

        <UI>
            <UIRef Id="DM_WixUI_Advanced"/>

            <Publish Dialog="DM_ExitDialog" Control="Finish" Event="DoAction" Value="CA_Run_ProjectX">
                RUN_ProjectX_ON_EXIT and <![CDATA[&Ftr_Configurator=3]]> and NOT Installed
            </Publish>

            <Publish Dialog="DM_ExitDialog" Control="Finish" Event="DoAction" Value="CA_Install_Screensaver">
                INSTALL_SCREENSAVER_ON_EXIT and <![CDATA[&Ftr_Screensaver=3]]> and NOT Installed
            </Publish>

            <Dialog Id="DM_ExitDialog" Width="370" Height="270" Title="!(loc.ExitDialog_Title)">
                <Control Id="Finish" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Cancel="yes"
                         Text="!(loc.WixUIFinish)"/>
                <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Disabled="yes"
                         Text="!(loc.WixUICancel)"/>
                <Control Id="Bitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="234" TabSkip="no"
                         Text="!(loc.ExitDialogBitmap)"/>
                <Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Disabled="yes"
                         Text="!(loc.WixUIBack)"/>
                <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0"/>
                <Control Id="Description" Type="Text" X="135" Y="70" Width="220" Height="40" Transparent="yes"
                         NoPrefix="yes"
                         Text="Thank you for choosing ProjectX. We sincerely hope it satisfies your needs."/>
                <Control Id="Title" Type="Text" X="135" Y="20" Width="220" Height="60" Transparent="yes" NoPrefix="yes"
                         Text="!(loc.ExitDialogTitle)"/>
                <Control Id="RunProjectXCheckBox" Type="CheckBox" X="135" Y="150" Width="220" Height="40" Hidden="yes"
                         Property="RUN_ProjectX_ON_EXIT" CheckBoxValue="1" Text="Run ProjectX Configurator">
                    <Condition Action="show"><![CDATA[&Ftr_Configurator=3]]></Condition>
                </Control>
                <Control Id="InstallScreensaverCheckBox" Type="CheckBox" X="135" Y="190" Width="220" Height="40"
                         Hidden="yes" Property="INSTALL_SCREENSAVER_ON_EXIT" CheckBoxValue="1"
                         Text="Install ProjectX as your screensaver">
                    <Condition Action="show"><![CDATA[&Ftr_Screensaver=3]]></Condition>
                </Control>
            </Dialog>

            <InstallUISequence>
                <Show Dialog="DM_ExitDialog" OnExit="success" Overridable="yes"/>
            </InstallUISequence>

            <AdminUISequence>
                <Show Dialog="DM_ExitDialog" OnExit="success" Overridable="yes"/>
            </AdminUISequence>
        </UI>

        <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed."/>

        <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="ProgramFiles64Folder">
                <Directory Id="APPLICATIONFOLDER">
                    <Directory Id="Dir_jre" Name="jre"/>
                    <Directory Id="Dir_jars" Name="jars"/>
                </Directory>
            </Directory>

            <Directory Id="ProgramMenuFolder">
                <Directory Id="Dir_Menu_ProjectX" Name="ProjectX"/>
            </Directory>

            <Component Id="Cmp_Auto_Connect_to" Win64="yes">
                <RegistryValue Root="HKLM" Key="Software\X Inc\ProjectX" Name="AutoConnectTo" Type="string"
                               Value="[AUTO_CONNECT_TO]"/>
            </Component>

            <Directory Id="SystemFolder"/>
        </Directory>

        <DirectoryRef Id="APPLICATIONFOLDER">
            <Component Id="Cmp_ProjectX_Configurator_exe" Guid="" Win64="yes">
                <File Id="File_FT_D_ProjectX_Configurator_exe"
                      Source="$(var.STAGING_DIR)\ProjectX Configurator.exe" KeyPath="yes">
                    <Shortcut Id="Shrt_ProjectX_Configurator" Name="ProjectX Configurator" Directory="Dir_Menu_ProjectX"
                              Advertise="yes" Icon="Icon_ProjectX.ico"/>
                </File>
                <RemoveFolder Id="Rm_Menu_ProjectX_1" Directory="Dir_Menu_ProjectX" On="uninstall"/>
            </Component>
            <Component Id="Cmp_ProjectX_Displayer_exe" Guid="" Win64="yes">
                <File Id="File_FT_D_ProjectX_Displayer_exe" Source="$(var.STAGING_DIR)\ProjectX Displayer.exe"
                      KeyPath="yes">
                    <Shortcut Id="Shrt_ProjectX_Displayer" Name="ProjectX Displayer" Directory="Dir_Menu_ProjectX"
                              Advertise="yes" Icon="Icon_ProjectX.ico"/>
                </File>
                <RemoveFolder Id="Rm_Menu_ProjectX_2" Directory="Dir_Menu_ProjectX" On="uninstall"/>
            </Component>
            <Component Id="Cmp_ProjectX_Renderer_exe" Guid="" Win64="yes">
                <File Id="File_FT_D_ProjectX_Renderer_exe" Source="$(var.STAGING_DIR)\ProjectX Renderer.exe"
                      KeyPath="yes">
                    <Shortcut Id="Shrt_ProjectX_Renderer" Name="ProjectX Renderer" Directory="Dir_Menu_ProjectX"
                              Advertise="yes" Icon="Icon_ProjectX.ico"/>
                </File>
                <RemoveFolder Id="Rm_Menu_ProjectX_3" Directory="Dir_Menu_ProjectX" On="uninstall"/>
            </Component>
            <Component Id="Cmp_Prosaver_scr" Guid="" Win64="yes">
                <File Id="File_FT_D_Prosaver_scr" Source="$(var.STAGING_DIR)\Prosaver.scr" KeyPath="yes"/>
            </Component>
            <Component Id="Cmp_Icon" Guid="" Win64="yes">
                <File Id="File_Icon" Source="src\main\installer\ProjectX.ico" KeyPath="yes"/>
            </Component>
        </DirectoryRef>

        <DirectoryRef Id="Dir_Menu_ProjectX">
            <Component Id="Cmp_Install_Screensaver" Guid="" Win64="yes">
                <Shortcut Id="Shrt_Install_Screensaver" Name="Install ProjectX Screensaver"
                          WorkingDirectory="SystemFolder" Icon="Icon_ProjectX.ico"
                          Target="[SystemFolder]rundll32.exe"
                          Arguments="desk.cpl,InstallScreenSaver [#File_FT_D_Prosaver_scr]"/>
                <RemoveFolder Id="Rm_Menu_ProjectX_4" On="uninstall"/>
                <RegistryValue Root="HKCU" Key="Software\X Inc\ProjectX" Name="installed" Type="integer"
                               Value="1" KeyPath="yes"/>
            </Component>
            <Component Id="Cmp_ProjectX_Support" Guid="" Win64="yes">
                <util:InternetShortcut Id="IShrt_ProjectX_Support" Name="ProjectX Support" IconFile="[#File_Icon]"
                                       Target="https://support.ProjectX.tech"/>
                <RemoveFolder Id="Rm_Menu_ProjectX_5" On="uninstall"/>
                <RegistryValue Root="HKCU" Key="Software\X Inc\ProjectX" Name="installed" Type="integer"
                               Value="1" KeyPath="yes"/>
            </Component>
        </DirectoryRef>

        <CustomAction Id="CA_Run_ProjectX" Directory="APPLICATIONFOLDER" Return="asyncNoWait"
                      ExeCommand="[#File_FT_D_ProjectX_Configurator_exe]"/>
        <CustomAction Id="CA_Install_Screensaver" Directory="SystemFolder" Return="asyncNoWait"
                      ExeCommand="[SystemFolder]rundll32.exe desk.cpl,InstallScreenSaver [#File_FT_D_Prosaver_scr]"/>

        <Feature Id="ProductFeature" Title="ProjectX" Level="1" Display="expand"
                 Description="ProjectX.">
            <ComponentGroupRef Id="ComGrp_JRE"/>
            <ComponentGroupRef Id="ComGrp_JARS"/>
            <ComponentRef Id="Cmp_Auto_Connect_to"/>
            <ComponentRef Id="Cmp_ProjectX_Support"/>
            <ComponentRef Id="Cmp_Icon"/>

            <Feature Id="Ftr_Configurator" Title="Configurator" Level="1"
                     Description="This is the application you use to register a new account as well as configure what websites are displayed, what displayers and renderers have access, etc. You need this in at least one computer to control your account.">
                <ComponentRef Id="Cmp_ProjectX_Configurator_exe"/>
            </Feature>
            <Feature Id="Ftr_Displayer" Title="Displayer" Level="1"
                     Description="This is what displays web sites. You need this (or the screensaver) on all the computers connected to screens that displays web sites.">
                <ComponentRef Id="Cmp_ProjectX_Displayer_exe"/>
            </Feature>
            <Feature Id="Ftr_Renderer" Title="Renderer" Level="1"
                     Description="This accesses your websites and generates the screenshots for the displayers. You need at least one of these although the Configurator can also act as a Renderer.">

                <ComponentRef Id="Cmp_ProjectX_Renderer_exe"/>
            </Feature>
            <Feature Id="Ftr_Screensaver" Title="Screensaver" Level="1"
                     Description="This is what displays web sites as the screensaver. You need this (or the displayer) on all the computers connected to screens that displays web sites.">
                <ComponentRef Id="Cmp_Prosaver_scr"/>
                <ComponentRef Id="Cmp_Install_Screensaver"/>
            </Feature>
        </Feature>
    </Product>
</Wix>

生成的MSI的摘要信息如下所示(GUID已更改):

The summary information for the generated MSI looks like this (GUID changed):

,该目录指向使用ProgramFiles64Folder.我找不到任何错误:

and the directory points to the use of ProgramFiles64Folder. I can't find anything wrong:

%ProgramFiles%仍指向正确的位置:

>echo %ProgramFiles%
C:\Program Files

,而且我也以相同的方式(安装到C:\Program Files (x86))在两台不同的计算机上失败了.

and I also had this fail on two separate computers in the same way (installing to C:\Program Files (x86)).

如果将Directory更改为ProgramFilesFolder而不是ProgramFiles64Folder,则会得到预期的错误:

If I change the Directory to be ProgramFilesFolder instead of ProgramFiles64Folder, then, I get the expected errors:

error LGHT0204 : ICE80: This 64BitComponent cmpCBBF8379128F087B61BD92F8113C95D6 uses 32BitDirectory dir451F8F132CB17CBF5649679474428CE4

以防万一,我打开注册表编辑器并删除了所有对C:\Program Files (x86)\X LCC的提及.没关系:(

Just in case, I open the registry editor and removed all mentions of C:\Program Files (x86)\X LCC. That made no difference :(

作为尝试,我尝试为目录指定名称:

I tried specifying a name to the directory, as an experiment:

<Directory Id="ProgramFiles64Folder" Name="Program Files">

这也没有什么区别.

推荐答案

很着急 :在您编译的MSI中,也许尝试更改首先进入表格(在编译后使用 Orca 进行修复):

更改:

  • WixSetDefaultPerMachineFolder,51,WixPerMachineFolder,[ ProgramFilesFolder ],[ApplicationFolderName]
  • WixSetDefaultPerMachineFolder, 51, WixPerMachineFolder, [ProgramFilesFolder], [ApplicationFolderName]

进入:

  • WixSetDefaultPerMachineFolder,51,WixPerMachineFolder,[ ProgramFiles64Folder ],ApplicationFolderName]
  • WixSetDefaultPerMachineFolder, 51, WixPerMachineFolder, [ProgramFiles64Folder], ApplicationFolderName]

我没有时间适当地测试上述内容,但是如果您查看CustomAction table,将会看到WixSetDefaultPerMachineFolder[ProgramFilesFolder][ApplicationFolderName]分配给WixPerMachineFolder.然后,您在ControlEvent表中会用WixAppFolder = "WixPerMachineFolder"等进行很多操作……相当令人困惑.然后,看起来WixPerMachineFolder已分配给APPLICATIONFOLDER.对话框中使用的实际属性似乎是WIXUI_INSTALLDIR.现在无法完全跟踪-请尝试上面的简单技巧(只需将路径设置为 ProgramFiles64Folder )-它可能会将路径拖入提交中.然后以所有安装模式(安装,修复,自我修复,修改,卸载,主要升级,补丁,管理员安装等)测试整个过程.

I don't have time to test the above properly, but if you look in the CustomAction table you will see that WixSetDefaultPerMachineFolder assigns [ProgramFilesFolder][ApplicationFolderName] to WixPerMachineFolder. Then you have lots of stuff going on in the ControlEvent table with WixAppFolder = "WixPerMachineFolder" etc... Quite confusing. Then it looks like WixPerMachineFolder is assigned to APPLICATIONFOLDER. The actual property used in the dialog seems to be WIXUI_INSTALLDIR. Can't track it all right now - please try the simple hack above (just set the path to ProgramFiles64Folder) - it might yank the paths into submission. Then test the whole thing to death in all installation mode (install, repair, self-repair, modify, uninstall, major upgrade, patch, admin install, etc...).

对不起,我们祝你好运.

Sorry for the rush, good luck.

这篇关于如何制作64位MSI?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆