C# WIX自动生成GUID*?

C# WIX自动生成GUID*?,c#,wix,guid,C#,Wix,Guid,假设我生成了产品Id为*的WIXXML文件。对于每个组件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如何知道已经安装了

假设我生成了产品Id为*的WIXXML文件。对于每个组件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


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

可以帮助您。请确保检查该文章中引用的MSDN链接,以更好地了解其工作原理。

Product/@Id=“*”
随机生成一个新的GUID,该GUID足以用于产品代码
Component/@Guid=“*”
计算一个只要目标路径保持不变就保持不变的Guid,这是遵守组件规则所必需的。

将其他版本链接到新版本的是升级代码。假设您希望使用升级功能,则相同产品的情况不应改变。否则,几乎就像每个版本都是不同的产品一样

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

来自:

如果您希望以MSP的形式发布更新(小更新或小升级) Microsoft术语)不要使用自动生成的GUID。如果你只是 是否打算将更新作为需要更改的MSI(主要升级)发布 产品代码每次都会自动生成。见->


这可能有点误导,但我确实有很多文件作为组件导入到新的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

必须为product元素中的属性“UpgradeCode”设置一个值。它必须是唯一的,并且在安装的所有未来版本中必须保持不变。升级代码负责让安装升级或不升级,具体取决于正在执行的安装版本

即:



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

WiX文档将对此给出清晰且易于找到的答案。如果没有,您不应该查看该GUID(称为undocumented),但WIX是否会在每次编译时为every*创建新的GUID?然后它如何链接该GUID?这可能会帮助您消除疑虑。除了下面的答案外,请尝试本文以澄清何时应更改组件GUID:。非常感谢。那么这对自动生成产品ID意味着什么呢?产品ID的GUID用于什么?换句话说,每次构建生成唯一产品ID的利弊是什么?@aherrick产品代码必须更改才能使用主要升级。有关详细信息的链接,请参见Yan的答案。Bob-谢谢,但这并不能真正回答我的问题。我想接受这个答案,但还不能完全接受。如果每次重新编译安装程序时都会生成新的GUID,那么该GUID如何链接到安装程序的其他版本?还是通过升级代码GUID链接?如果链接是我期望的升级代码GUID,随机生成的产品Id GUID的用途是什么?请注意,组件GUID的值为\*时,我的candle进程(从cmd运行)告诉我该值无效,但使用*有效。当通过Visual Studio 2017调用时,这两种方法都有效。对,谢谢,那么产品ID GUID的用途是什么?这是我在这里仍然感到困惑的主要问题。那么,在每个构建中生成一个随机的产品ID和保持一个GUID有什么好处/问题呢?基本上什么都没有?更清楚地说,因为我花了很长时间才明白,如果您希望在任何时候目标计算机上都只存在一个版本的产品,那么所有版本都必须具有相同的
UpgradeCode
<Product Id="*" Name="My Application" Language="1033" Version="1.1.0" Manufacturer="Myself :p" UpgradeCode="{561DA858-5398-4B87-8F3A-8B8BB12650F6}">