如何制作64位MSI? [英] How do I make a 64 bit MSI?
问题描述
我已指定:
-
运行
-
-arch x64
. -
Platform=x64
. -
ProgramFiles64Folder
作为安装内容的Directory
id.
candle.exe
时Package
上的-arch x64
when runningcandle.exe
.Platform=x64
on thePackage
.ProgramFiles64Folder
as theDirectory
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
- Wix Cookbook中有关64位安装程序的部分
- 如何获取WiX生成64位MSI?
- 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中,也许尝试更改
更改:
- 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屋!