msi版本号

时间:2012-02-16 13:34:45

标签: windows-installer

我对msi版本号感到困惑。 Here用于Property表和Update表中的ProductVersion的版本号限制为主要部分和次要部分为256或更少。 Here File表中使用的版本号可以包含65536或更少的主要和次要部分。

其中一个是错的吗?这两个“版本”完全不相关或者是什么?

此外,我不明白文件表File Table的说明中的内容如下所示。

“版本

此字段是版本化文件的版本字符串。对于非版本化文件,此字段为空。输入此字段的文件版本必须与安装包中包含的文件版本相同。“

如何确定安装包中包含“版本的文件”?例如,Visual Studio的VS_VERSION_INFO资源中的FILEVERSION值是多少?使用NotePad或Word创建的某些文件意味着什么?

究竟什么是“非版本化”文件?在VS_VERSION_INFO资源中有一个FILEVERSION = 0.0.0.0吗?或者是其他东西?是否所有.exe文件都被认为是版本化的?

2 个答案:

答案 0 :(得分:22)

是的,FileVersions和ProductVersions是无关的。 ProductVersion显示在“添加/删除程序”(程序和功能)中,主要用于主要升级方案以确定应该发生的情况。

ProductVersion属性定义为[0-255]。[0-255]。[0-65535](分别为8,8,16个有符号位) 文件版本定义为[0-65535]。[0-65535]。[0-65535]。[0-65535](16,16,16,16有符号位...)

Text / XML / Config / BMP ectera将为null。通常,您的创作工具(例如InstallShield)将在构建时反映您的版本化PE文件(DLL,OCX,SYS,EXE ...),并自动将其版本号创建到File表中。

InstallShield中还有一个名为“Always Overwrite”的选项,它在构建时向MSI“版本所在”并告诉它您的非PE文件(TXT / XML ....)确实有版本号(通常65535.0.0.0)这会在决定覆盖或不覆盖时利用MSI中版本化文件特朗普非版本文件的行为。

技术上,EXE可以是非版本的,但这是一种反模式。非版本化文件是没有嵌入版本资源记录的任何文件。

另一件需要理解的事情是,默认情况下,Windows Installer会在决定src文件是否覆盖目标时查看目标文件的创建日期和修改日期。如果CD和MD等于它被认为是'处女'(我的术语)并且发生覆盖。如果它们不相等则被视为“用户数据”并且除非您执行“始终覆盖”技巧,否则不会被覆盖。

要理解的另一件事是这些评估发生在组件的密钥文件级别。组件中的任何其他伴随文件(如果不遵循每个组件的1:1文件指南)将遵循密钥文件的方向。

还要意识到AssemblyVersion和AssemblyFileVersion之间存在差异。 .NET AssemblyFileVersion属性映射到旧的FileVersion属性。 AssemblyVersion属性仅用于强命名,MSI不关心它。

最后,请参阅Google“Windows Installer组件规则”以获取更多信息。

如果这有意义,如果您有任何其他问题,请告诉我。你实际上在一个问题中询问了十几个问题,所以我可能会错过一些东西。也请随时接受这个答案。

答案 1 :(得分:0)

是的,MSI文件表中的MSI ProductVersion与版本无关。

是的,FILEVERSION中的VERSIONINFO可用于在MSI文件表中设置版本。

上下文中的版本字词

使用MSI版本时,通常从VERSIONINFO resource(在资源文件中使用)或.NET assembly上下文中检索数字。与以下术语相比,MSI术语可能更易于理解:

版本

  • Windows安装程序:string data type,用于MSI文件表中包含它的文件
  • 资源文件:数据类型,由2x32位整数组成
  • .NET程序集:AssemblyName.Version可能具有可比性

产品版本

  • Windows安装程序:string property(因此,Orca / SuperOrca可以在MSI文件中找到它)
  • 资源文件:PRODUCTVERSION,使用版本数据类型的语句
  • .NET程序集:AssemblyVersion,使用AssemblyName.Version

文件版本

  • Windows安装程序:既不是属性也不是数据类型。它用作组合版本字符串和语言字符串的术语。 Windows安装程序方法Installer.FileVersionMsiGetFileVersion ...

      

    [..]返回版本字符串或语言字符串

    MSI中不存在“ FileVersion”属性。

  • 资源文件:FILEVERSION,使用版本数据类型的语句
  • .NET程序集:AssemblyFileVersionAttribute

版本号限制

Windows安装程序中的版本数据类型-尽管是字符串-与资源文件中的版本数据类型具有相同的限制...

  

版本由两个32位整数组成,由四个16位整数定义。

...以及AssemblyName.Version ...

  

元数据将程序集的主要,次要,内部和修订版本组件限制为最大值UInt16.MaxValue-1

以防万一:

  • 该程序是使用资源文件构建的
  • 在构建/部署过程中,
  • PRODUCTVERSIONAssemblyVersion用于MSI ProductVersion属性

开发人员必须注意:

  1. VERSIONINFO / AssemblyName.Version(无符号16bit.16bit.16bit.16bit)
  2. 的局限性
  3. Windows安装程序对产品版本(未签名的8bit.8bit.16bit)的限制,而第四个字段doesn't matter
      

    如果您在产品版本中包含第四个字段,则安装程序将忽略第四个字段。


因此,在部署过程中使用的程序(将程序的版本号用于MSI设置)必须遵守以下限制:

  • PRODUCTVERSION / AssemblyVersion 8bit.8bit.16bit-1.16bit-1 (无符号整数)
  • FILEVERSION / AssemblyFileVersion 16bit-1.16bit-1.16bit-1.16bit-1 (无符号整数)

请指出这些比较的缺点/不足。