2009-12-17 57 views
17

我使用基于WIX的安装程序。如何实现32&64平台的单个安装程序

安装程序分别构建到32和64平台。这两个平台的安装程序版本非常相似,但很少有条件步骤,例如避免在32位安装程序中注册x64本地dll。

有没有办法将两个安装程序联合为一个?

回答

27

这是无法完成的。这是Windows Installer的一个限制,如果你想做到这一点而不是两倍,那么你需要两个MSI的外部CAB文件和一个引导程序来执行正确的安装。如果不需要MSI,请尝试NSIS。您可以很容易地基于OS架构进行条件安装。

反正this has been also asked on the WiX-users list在最近几周多次,我能找到的最好的回应是这样的一个布莱尔:

的MSI标记为64位,根本不会在32位系统上安装。没有什么 你可以做。

标记为32位的MSI根本无法将文件放入“64位目录” (它们将被重定向到32位“等同”文件夹)。没什么可以 做的。

MSI不能标记为32位和64位。也没有什么可以做的。

“正确的”方法是生成两个MSI,一个用于32位平台,另一个用于64位平台。他们可以共享相同的外部驾驶室文件,​​如果您需要将它们运输到一起以节省空间,则需要 。如果你这样做,你可以使用一个 引导程序来提取适合你的CAB并安装它。

+1

谢谢sascha,这非常有帮助! NSIS看起来很酷,我希望我知道如果以前,它可以让我们更简单的安装:) – Elisha 2009-12-19 07:37:54

+0

这不完全是真的......我试图安装在System32文件夹上使用x86编译在64位操作系统上,它总是将这些库复制到64位文件夹而不是32文件夹中。所以它不会自动重定向... – Sonhja 2014-04-09 08:51:13

1

我对WiX说得不够了解,但有传闻证据表明这不被推荐。我想起了我看到的所有下载(MSDN和许多其他),您必须在32位和64位安装程序之间进行选择。其实现在我想到了它,我从未见过也没有听说过“通用安装程序”。

+0

感谢您的回答。我同意大多数安装程序都有分离的版本,你知道为什么吗?用户减少后顾之忧是有益的。我仍然很想知道这是否可能。 – Elisha 2009-12-17 15:11:05

+0

我认为最可能的原因是很少有文件在32位和64位版本之间共享,所以组合安装程序至少是两倍。所以 - 这是可能的,但如果您需要64位,则需要下载32位文件将会很不方便,反之亦然。 – 2009-12-17 15:38:21

3

在某种程度上是可能的。不过,你无法单独使用微星。这方面的一个例子是Microsoft的.NET安装包; “完全安装”包具有x86位,x64位和ia64支持。但是,此安装程序使用引导过程来执行此操作;它有一个单独的程序,确定要安装的内容,然后安装它。在下面,您仍然需要32位MSI和64位MSI软件包。

虽然被警告;然后安装程序引导程序的体系结构将确定它可以安装的内容。如果它是基于x86的引导程序,那么它只能在安装了WOW64的32位窗口和64位窗口(Win2k8 R2的可移动选项)上运行,并且在ia64平台上可能根本无法运行!

提供单独的安装程序确实非常简单,因此捆绑它们真的不值得。您会将安装程序大小加倍或增加三倍,这可能会关闭一些客户。如果它是一个内部工具,那么真的没有任何缺点 - 可用的原始msi允许有更多(远程)安装选项。

简而言之:是的,你可以,但不能与MSI。

1

您可以尝试在组件的条件标签中使用PROCESSOR_ARCHITECTURE环境变量,以仅注册到特定体系结构需要注册的内容,这将在MSI运行时适用...不适用于构建时。

例检测64位操作系统:

<Component Id="..." Guid="PUT-GUID-HERE"> 
    <Condition>NOT(%PROCESSOR_ARCHITECTURE = "x86")</Condition> 
    ... 
</Component> 


例检测32位操作系统:

<Component Id="..." Guid="PUT-GUID-HERE"> 
    <Condition>%PROCESSOR_ARCHITECTURE = "x86"</Condition> 
    ... 
</Component> 


如果您想了解更多关于MSI引用的环境变量看本页:http://msdn.microsoft.com/en-us/library/windows/desktop/aa368012(v=vs.85).aspx#Access_Prefixes

关于究竟PROCESSOR_ARCHITECTURE将在何种情况下返回更多信息,请参见本页面:https://superuser.com/q/396267/117857

然而,在这个答案的评论指出,这可能不是真正的你在找什么。但我认为(未验证)您可以创建一个包含32位和64位MSI的引导程序,然后让引导程序根据操作系统体系结构选择在运行时应用哪个MSI,尽管我没有尝试过这种方法,不知道该怎么做,如果我发现,我一定会发布答案。

+1

这不会让您在32位软件包中混合使用64位和32位组件。这是一个MSI规则/限制。 – 2013-02-08 00:45:41

+0

@BobArnson嗯,它似乎是我所发现的最接近它的东西。 – bsara 2013-02-08 18:35:26

相关问题