2012-02-16 102 views
9

我對msi版本號感到困惑。 Here「屬性」表和「更新」表中用於ProductVersion的版本號限制爲256或更少的主要部分和次要部分。 Here「文件」表中使用的版本號可以包含65536或更少的主要部分和次要部分。msi版本號

是這些錯誤的嗎?這兩個「版本」是完全不相關的還是什麼?

另外,我不明白是什麼在文件表File Table手段的描述下面找到。

「版本

此字段是版本字符串一個版本的文件,該字段爲空非版本的文件。該文件版本進入這一領域必須是相同的文件的版本附帶安裝包「。

如何確定安裝包附帶的「版本的文件」?它是例如Visual Studio的VS_VERSION_INFO資源中的FILEVERSION的值嗎?對於用NotePad或Word創建的某些文件意味着什麼?

而且究竟什麼是「非版本」文件?其中一個VS_VERSION_INFO資源中的FILEVERSION = 0.0.0.0?或者是其他東西?是否所有的.exe文件都考慮過版本控制?

回答

20

是,文件版本和ProductVersions無關。 ProductVersion顯示在「添加/刪除程序」(「程序和功能」)中,主要用於主要升級場景期間決定發生的情況。

ProductVersion屬性定義爲[0-255]。[0-255]。[0-65535](分別爲8,8,16有符號位) 文件版本定義爲[0-65535]。[0 [0-65535]。[0-65535](16,16,16,16有符號位...)

Text/XML/Config/BMP ectera將爲空。通常,您的創作工具(如InstallShield)會在構建時反映您的版本化PE文件(DLL,OCX,SYS,EXE ...),並自動將它們的版本編號創建到File表中。

在構建時,InstallShield中還有一個名爲「始終覆蓋」的版本「向版本謊言」,並告訴它您的非PE文件(TXT/XML ....)確實有版本號(通常是65535.0.0.0)這會利用MSI中的行爲,即在決定是否覆蓋時版本控制文件勝出非版本控制文件。

Tecnically一個EXE可以是非版本,但是這是一個反模式。非版本化文件是沒有嵌入版本資源記錄的任何文件。

要理解的另一件事是默認情況下,Windows安裝程序在決定src文件是否應覆蓋目標時查看目標文件的創建日期和修改日期。如果CD和MD相同,它被認爲是「處女」(我的術語),併發生覆蓋。如果它們不相等,則認爲是「用戶數據」,除非您執行始終覆蓋技巧,否則不會被覆蓋。

要理解的另一件事是這些評估發生在組件的密鑰文件級別。組件中的任何其他伴隨文件(如果沒有遵循每個組件準則的1:1文件)將遵循密鑰文件的指示。

也意識到存在的AssemblyVersion和的AssemblyFileVersion之間的差異。這個。NET AssemblyFileVersion屬性映射到舊版FileVersion屬性。 AssemblyVersion屬性僅用於強命名的目的,MSI不關心它。

最後,谷歌「Windows安裝程序組件規則」瞭解更多信息。

請讓我知道這是否有意義,如果您有任何其他問題。你實際上在一個問題中詢問了十幾個問題,所以我可能會錯過一些東西。也請隨時接受這個答案。

+0

謝謝,這有幫助。視覺工作室或插件中是否有任何設施可以自動撞擊FILEVERSION? PRODUCTVERSION在VS_VERSION_INFO中有什麼意義。版本12.2.16和12.02.16是否相同? – 2012-02-16 15:01:23

+2

這是一個完全不同的蠕蟲處理構建自動化和連續集成,它負責構建您的應用程序和您的應用程序安裝程序。您將希望該過程對應用程序文件進行版本化並將產品版本屬性傳遞給安裝程序版本。有很多取決於你的構建環境的樣子。我個人使用的團隊基礎服務器團隊建設與http://tfsversioning.codeplex.com/一起您可能會使用InstallShield或Wise或VB6,Deplhi,PowerBuilder,C#,Java我知道的所以沒有具體的答案。 – 2012-02-16 15:04:24

+0

MSIEXEC是否真的檢查.exe文件中的版本是否與文件表中的版本匹配? – 2012-02-16 22:10:48