我对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文件都被认为是版本化的?
答案 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术语可能更易于理解:
版本
AssemblyName.Version
可能具有可比性产品版本
PRODUCTVERSION
,使用版本数据类型的语句AssemblyVersion
,使用AssemblyName.Version
文件版本
Windows安装程序:既不是属性也不是数据类型。它用作组合版本字符串和语言字符串的术语。 Windows安装程序方法Installer.FileVersion和MsiGetFileVersion ...
[..]返回版本字符串或语言字符串
MSI中不存在“ FileVersion”属性。
FILEVERSION
,使用版本数据类型的语句AssemblyFileVersionAttribute
Windows安装程序中的版本数据类型-尽管是字符串-与资源文件中的版本数据类型具有相同的限制...
版本由两个32位整数组成,由四个16位整数定义。
...以及AssemblyName.Version
...
元数据将程序集的主要,次要,内部和修订版本组件限制为最大值UInt16.MaxValue-1
以防万一:
PRODUCTVERSION
或AssemblyVersion
用于MSI ProductVersion属性开发人员必须注意:
VERSIONINFO
/ AssemblyName.Version
(无符号16bit.16bit.16bit.16bit)和 如果您在产品版本中包含第四个字段,则安装程序将忽略第四个字段。
因此,在部署过程中使用的程序(将程序的版本号用于MSI设置)必须遵守以下限制:
PRODUCTVERSION
/ AssemblyVersion
: 8bit.8bit.16bit-1.16bit-1 (无符号整数)FILEVERSION
/ AssemblyFileVersion
: 16bit-1.16bit-1.16bit-1.16bit-1 (无符号整数)请指出这些比较的缺点/不足。