【问题标题】:Role of various GUIDs in WiX ("error: The specified account already exists")WiX 中各种 GUID 的作用(“错误:指定的帐户已存在”)
【发布时间】:2015-07-03 12:05:14
【问题描述】:

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

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

以前,我已经发布了版本。我的程序的 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。

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

【问题讨论】:

    标签: wix


    【解决方案1】:

    看看这是否有帮助:

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

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

    UpgradeCode guid 是产品线属性。当您运送产品 2012、产品 2013、产品 2015 时,每个产品都会替换旧产品,然后他们将使用相同的升级代码,因为这用于搜索那些较早的产品并升级它们。

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

    此外,捆绑代码以 MSI 方法为模型,但未连接。这个想法是捆绑包具有相同的架构 - 它们需要检测当前的并升级旧的,因此它们也使用升级和产品代码,

    在您的情况下,您正尝试安装相同的 ProductCode,这不是创建重大升级的好开始。

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

    【讨论】:

    • 太棒了!我已将 Product.Id 替换为“*”(正如 Marlos 建议的那样),它似乎有效。升级是无缝的。
    【解决方案2】:

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

    1. MSI 引擎在注册表中搜索匹配的 UpgradeCode。
    2. 如果遇到它,MSI 会搜索 ProductCode(WiX 中的 ID)。
    3. 如果遇到它,则 MSI 会停止升级。
    4. 如果不是,则搜索版本并比较它是在执行降级还是升级。

    解决办法是把Product.Id换成新版本。在我的项目中,我使用Product Id="*",因为在我的情况下,每次构建都会更新版本。

    【讨论】:

    • 我想接受这两个答案,但它似乎是一个切换:o(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-07
    • 1970-01-01
    • 2020-10-13
    • 1970-01-01
    • 1970-01-01
    • 2014-05-30
    • 1970-01-01
    相关资源
    最近更新 更多