【问题标题】:WIX Autogenerate GUID *?WIX 自动生成 GUID *?
【发布时间】:2011-08-15 11:53:34
【问题描述】:

假设我生成了产品 ID 为 * 的 WIX XML 文件。对于每个组件 GUID,我也使用 *.

  <Product Id="*" Name="xxx" Language="1033" Version="1.0.0.0" Manufacturer="xxx" UpgradeCode="xxx">

在我每次编译我的 WIX 安装程序时都会旋转一个唯一的 GUID?假设我已经安装了 1.0.0 版的机器。然后我将我的 WIX 安装程序重新编译到版本 1.0.1。

当我去安装 1.0.1 时,WIX 如何知道 1.0.0 已经安装,因此会删除所有文件/注册表项并安装 1.0.1?

我应该使用来自 GUID 的 * 还是应该在我的 WIX XML 配置中使用唯一的 ID/GUID?

【问题讨论】:

标签: c# wix guid


【解决方案1】:

Product/@Id="*" 随机生成一个新的 GUID,对于产品代码来说已经足够了。 Component/@Guid="*"计算一个 GUID,只要您的目标路径保持不变,这个 GUID 就保持不变,这是遵守组件规则所必需的。

【讨论】:

  • 非常感谢。那么这对于自动生成的产品 ID 意味着什么?用于产品 ID 的 GUID 是什么?换句话说,每次构建生成唯一的产品 ID 的优缺点是什么?
  • @aherrick 产品代码必须更改才能使用主要升级。有关详细信息的链接,请参阅 Yan 的答案。
  • Bob- 谢谢,但这并不能真正回答我的问题。我想接受这个答案,但还不能。如果每次重新编译安装程序时都会生成一个新的 GUID,那么该 GUID 是如何链接到其他版本的安装程序的?还是通过升级代码 GUID 链接?如果链接是我所期望的升级代码 GUID,那么随机生成的产品 ID GUID 的用途是什么?
  • 请注意,当组件 GUID 的值为 \* 时,我的蜡烛进程(从 cmd 运行)告诉我该值无效,但使用 * 有效。通过 Visual Studio 2017 调用时,两者都有效。
【解决方案2】:

产品 ID (ProductCode) 将安装程序包中的所有内容唯一标识为特定产品。当您搜索以查看是否安装了以前的版本时,将对升级代码执行搜索。对于使用特定升级代码找到的所有项目,安装程序会将每个产品代码记录为同一产品的不同化身。因此,您可以说相同升级代码的不同产品代码标识不同的化身(如果您愿意,则为同一产品的版本)。

【讨论】:

  • 那么在每个构建版本上生成随机产品 ID 与保留一个 GUID 相比有什么好处/问题?基本上什么都没有?
  • 为了更清楚,因为我花了很长时间才明白,如果您希望目标计算机上始终只有一个版本,所有版本必须具有相同的 @987654321 @!
【解决方案3】:

来自http://windows-installer-xml-wix-toolset.687559.n2.nabble.com/Auto-generated-vs-statically-assigned-GUIDs-td4670083.html

如果您想以 MSP 的形式发布更新(Small Update 或 Minor Upgrade in Microsoft 术语)不使用自动生成的 GUID。如果你只是 曾经将更新作为 MSI(主要升级)发布,您需要更改 无论如何,产品代码每次都可以自动生成。见-> http://msdn.microsoft.com/en-us/library/aa370579.aspx

【讨论】:

    【解决方案4】:

    This quick guideline 可以帮助你。请务必查看该文章中引用的 MSDN 链接,以便更好地了解其工作原理。

    【讨论】:

      【解决方案5】:

      将其他版本链接到新版本的是升级代码。假设您要使用升级功能,这对于同一产品不应该改变。否则几乎每个版本都是不同的产品

      【讨论】:

      • 好的,谢谢,那么产品 ID GUID 的用途是什么?这是我在这里仍然感到困惑的主要问题。
      【解决方案6】:

      这可能有点误导,但我确实有很多文件作为组件导入到新的 WiX Product.wxs 文件中。在我使用Guid="*" 创建了所有组件后,我发现在尝试构建安装程序时,WiX 为每个组件报告了以下错误:

      组件“AjaxControlToolkit.dll”有一个路径为“TARGETDIR\ajaxcontroltoolkit.dll”的密钥文件。由于此路径未植根于标准目录之一(如 ProgramFilesFolder),因此此组件不符合自动生成 guid 的标准。

      我使用以下 PowerShell 脚本为每个组件分配一个新的 guid。请注意,此脚本将直接修改 Product.wxs 文件,并应保留文件的备份以防出现问题:

      (Get-Content Product.wxs) | 
      Foreach-Object { $guid = [guid]::NewGuid().ToString(); $_ -replace 'Guid="\*"',"Guid=""$guid"""}  | 
      Out-File Product.wxs
      

      【讨论】:

        【解决方案7】:

        您必须在产品元素中为属性“UpgradeCode”设置一个值。哪个必须是唯一的,并且对于设置的所有未来构建必须保持不变。升级代码负责根据正在执行的安装版本让安装升级或不升级。

        即:-

        <Product Id="*" Name="My Application" Language="1033" Version="1.1.0" Manufacturer="Myself :p" UpgradeCode="{561DA858-5398-4B87-8F3A-8B8BB12650F6}"> 
        

        不维护静态升级代码将导致重复相同的安装。

        【讨论】:

          猜你喜欢
          • 2012-06-25
          • 2016-01-15
          • 2023-03-12
          • 1970-01-01
          • 1970-01-01
          • 2013-10-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多