各种GUID在WiX中的作用(“错误:指定的帐户已存在”)

时间:2015-07-03 12:05:15

标签: wix

当我尝试安装使用WiX构建的升级时,我收到错误“指定的帐户已存在”,是的,我已阅读Windows msi: error 1316: the specified account already exists

我对各种GUID在WiX项目文件中的作用感到困惑。

以前,我已经发布了ver。 5.4.35我的课程; Product.wxs文件创建了一个MSI并包含以下指令:

<Product Id="4DF780D3-60EC-43D3-A537-8484FE03B793"
         Version="5.4.35"
         UpgradeCode="A2F60910-A7FC-4B96-9375-EFBED25CC826">

Burner使用以下Bundle.wxs文件从MSI创建了一个EXE:

<Bundle Version="5.4.35"
        UpgradeCode="0694ce56-8095-450c-9859-881c0c9d56f7">

我发布了新版本6.0.6,除了版本之外什么也没做。新的Product.wxs是:

<Product Id="4DF780D3-60EC-43D3-A537-8484FE03B793"   Same
         Version="6.0.6"
         UpgradeCode="A2F60910-A7FC-4B96-9375-EFBED25CC826">   Same

Bundle.wxs是:

<Bundle Version="6.0.6"
        UpgradeCode="0694ce56-8095-450c-9859-881c0c9d56f7">    Same

用户报告说在旧版本之上安装新版本失败,“修复”不起作用。他们必须完全卸载旧版本,并安装新版本,这很不方便。

安装程序确实包含一些自定义操作。没有组件或其他GUID。

我的问题:我应该更改什么以确保升级正常并且没有错误?

2 个答案:

答案 0 :(得分:3)

看看这是否有帮助:

ProductCode是指示系统上已安装此产品的guid。您不能安装两次相同的产品(严格来说,在相同的上下文中,例如每台机器)。根据定义,该产品已经安装,因此尝试重新安装它会导致(通常)维护模式修复操作。除非您的自定义操作具有适当的条件,否则它们将再次运行 - 如果在安装其拥有组件时运行自定义操作,则在组件作为修复的一部分重新安装时它将再次运行,因此它将尝试创建用户再次。

因此,主要升级需要新的ProductCode,因为您现在有一个新的完整产品安装,如果有的话,恰好会删除旧版本的产品。

UpgradeCode guid是产品系列属性。当您运送Product 2012,Product 2013,Product 2015,其中每个替换旧版本时,他们将使用相同的UpgradeCode,因为它用于搜索那些早期产品并进行升级。

主要升级还要求ProductVersion以前3位数递增,具有新的PackageCode(通常是自动的)并且仅升级相同的上下文(例如,每台机器将升级每台机器但不会按用户安装升级)。

此外,捆绑代码是在MSI方法上建模的,但未连接。我们的想法是捆绑包具有相同的体系结构 - 他们需要检测当前的体系结构并升级旧体系结构,因此它们也使用升级和产品代码,

在您的情况下,您正在尝试安装相同的ProductCode,这不是创建主要升级的良好开端。

我认为bundle会生成MSI活动的详细日志,因此它们非常有用。

答案 1 :(得分:2)

Product.Id是不同版本之间的标识符。它或多或少都是这样的:

  1. MSI引擎在注册表中搜索匹配的UpgradeCode。
  2. 如果遇到它,则MSI会搜索ProductCode(WiX中的ID)。
  3. 如果遇到它,则MSI停止升级。
  4. 如果没有,则会搜索该版本并比较它是否正在执行降级或升级。
  5. 解决方案是更改新版本的Product.Id。在我的项目中,我使用Product Id="*",因为在我的情况下,版本会在每次构建时更新。