打包關心的問題有 1).Net版本檢查 2)桌面和菜單欄的快捷方式 3)更換圖示畫面,進度條 4)自動打包 5)自動更新版本。6)安裝目錄和細節 帶着問題去探索,歡迎補充。先走通一個簡單的Demo,再回頭看概念。
第一個Wix set Up
1.先建立一個簡單的Winform程式

2. 在解決方案中右鍵添加新項目,選擇Windows Installer XML(前提你要安裝了wix Toolset v3.7),再選擇Setup Project,修改項目名稱,确定。
這樣子,解決方案下面會多一個Setup07的工程,這個工程下面有一個Product.wxs 檔案,預設已經打開,這是一個XML檔案,也就是工程的配置檔案,初次看上去各種元素不知所雲,先不管,先需要修改三個地方,首先需要引入MyApplication,
在第三行有一個Product元素,需要在Manfacturer中加入你或者你公司的名字。
再在最下方有一個Fragment元素塊,修改為
添加了這麼一段
完成之後,生成一下,這樣第一個簡單的wix打封包件已經在SetUp07的bin/debug下面生成了。
點選Setup07.msi 就可以安裝了。 但這個時候的安裝很快,因為比較簡單不會有什麼進度條,上一步下一步的,安裝完成之後桌面和菜單欄中都沒有圖示,因為你還沒有配置讓它有。但在c盤下的Rrogram Files(X86)下面可以找到Setup07這個檔案夾,打開他裡面就是Myapplication的exe。可以執行。
還有一個問題就是,隻要改變一次這個Myapplication ,重新生成,那麼打封包件也會自動生成一個新的,如果你沒有改變,隻是重複點生成,打封包件是不會更新的。這其實就是借助了MSBuild的機制,自動生成打封包件。當然這個程式的解除安裝目前就去控制台中手動解除安裝吧。
初步認識Wix
wix官方文檔說:用Msbulid生成wix,需要建立一個.wixproj 的檔案,其實這個檔案上面的Setup07中VS已經幫我們自動生成,隻是要打開檔案夾才能看到。
View Code
2)XML文檔元素
Wix本身就是基于XML,是以定義了很多特定的元素,剛開始一看,因為不熟悉容易搞暈。 先也隻是初步認識,深入了解還是需要後面的不斷測試。不全面的可以去看官方的文檔。
* Product 的父級隻有wix,主要由Id,Language,等屬性
Id:産品的GUID,GUID可以借助VS-->工具--->建立GUID 會有五種格式來供選擇,這裡用4,5,6。不要括号。
Codepage:指所在地區的代碼頁,用來進行區域區分
Language:指所在地區使用的語言,為數字編号,
Manufacturer:制作廠商
Name:産品名稱
UpgradeCode:産品更新的GUID
Version:版本号
下來列舉幾個常見的區域代号:
語言 語言-國家 Language Codepage
English en-us 1033 1252
Simplified Chinese zh-cn 2052 936
Traditional Chinese zh-tw 1028 950
*Package 記錄一些安裝包的資訊
InstallerVersion:安裝此安裝包需要的最小Windows Installer版本,用Windows Installer的主要版本乘以100 加上Window Installer的次要版本。 比如 “200” 代表的是Windows Installer2.0,而405代表的是Windows Installer4.5.
Compressed: 這個為Yes 表示在源檔案中含有壓縮檔案,對于Merge Module這個屬性不必設定。反正為 NoType.
InstallPrivileges:字面意思為安裝優先級,有limited 和 elevated兩種 後者是預設值,
InstallScope: 值為枚舉類型,字面意思為安裝範圍,值必須是perMachine 或者 perUser. 看文檔不知道确切的用處,先放過。
*MajorUpgrade 這個元素支援防止降級
AllowDowngrades:即回到低版本,如果設定為No(預設值) 會被阻止,這個時候DowngradeErrorMessage 屬性必須設定,以給出提示。
DowngradeErrorMessage:當你安裝一個低版本的安裝包時會給出的提示。
*Feature 一個特性表,特性是可安裝的最小單元。 子元素中的ComponentGroupRef 是和 ComponentGroup對應的。前者相當于一個安裝目錄,後者記錄了安裝檔案的具體位置。
Id:是唯一的
Title:就是個短的說明。
Level:安裝的等級,值為0 會使這個特性無效,預設值為1
Absent:這個屬性定義User是否有權在使用者接口中去選擇使某個特性不安裝(absent),值為allow或者disallow之一
*Fragment 元素是在wix中建立一個安裝資料庫的基礎塊(msi檔案就是個資料庫),定義之後,是不可改變的(目前不太了解....ORZ)。它的子元素中含有*Ref的元素必須有對應的單元,比如在Fragment中含有兩個Component元素,那麼 你必須在Feature中用ComponentRef 與Component對應. 預設生成的文檔中含有兩個Fragment塊。 一個包含的是Directory,一個包含的是ComponentGroup ,前者指的是安裝目錄,後者顧名思義就是Component的一個集合。
*Directory 産品的安裝目錄。第一個Directory Id=TARGETDIR 是根目錄,每一個wix工程都會有這個目錄元素,第二個Id=ProgramFilesFolder 對應的就是C:\Program Files\ ,64位的就在x86下,第三個元素就是我們自己的應用程式所在的檔案夾,最終形成就是c:\Program Files\My Application Name 在預設的提示中 也可以看見在Component 中添加安裝檔案,資源,系統資料庫等。這裡可以看見最裡面的Directory的Id=INSTALLFOLDER是和第二個Fragment中的ComponentGroup的Directory屬性是一緻的。在Component中就是每一個你需要安裝的單元以及它的位置。
Variable name
Example usage
Example value
var.ProjectName.Configuration
$(var.MyProject.Configuration)
Debug or Release
var.ProjectName.FullConfiguration
$(var.MyProject.FullConfiguration)
Debug|AnyCPU
var.ProjectName.Platform
$(var.MyProject.Platform)
AnyCPU, Win32, x64 or ia64
var.ProjectName.ProjectDir
$(var.MyProject.ProjectDir)
C:\users\myusername\Documents\Visual Studio 2010\Projects\MyProject\
var.ProjectName.ProjectExt
$(var.MyProject.ProjectExt)
.csproj
var.ProjectName.ProjectFileName
$(var.MyProject.ProjectFileName)
MyProject.csproj
var.ProjectName.ProjectName
$(var.MyProject.ProjectName)
MyProject
var.ProjectName.ProjectPath
$(var.MyProject.ProjectPath)
C:\users\myusername\Documents\Visual Studio 2010\Projects\MyProject\MyApp.csproj
var.ProjectName.TargetDir
$(var.MyProject.TargetDir)
C:\users\myusername\Documents\Visual Studio 2010\Projects\MyProject\bin\Debug\
var.ProjectName.TargetExt
$(var.MyProject.TargetExt)
.exe
var.ProjectName.TargetFileName
$(var.MyProject.TargetFileName)
MyProject.exe
var.ProjectName.TargetName
$(var.MyProject.TargetName)
var.ProjectName.TargetPath
$(var.MyProject.TargetPath)
C:\users\myusername\Documents\Visual Studio 2010\Projects\MyProject\bin\Debug\MyProject.exe
var.ProjectName.Culture.TargetPath
$(var.MyProject.en-US.TargetPath)
C:\users\myusername\Documents\Visual Studio 2010\Projects\MyProject\bin\Debug\en-US\MyProject.msm
var.SolutionDir
$(var.SolutionDir)
C:\users\myusername\Documents\Visual Studio 2010\Projects\MySolution\
var.SolutionExt
$(var.SolutionExt)
.sln
var.SolutionFileName
$(var.SolutionFileName)
MySolution.sln
var.SolutionName
$(var.SolutionName)
MySolution
var.SolutionPath
$(var.SolutionPath)
C:\users\myusername\Documents\Visual Studio 2010\Projects\MySolution\MySolution.sln
整體看一下 Directory定義了安裝目錄,Component定義了元件及位置,Feature定義了元件在安裝時的一些特性。Product和package等定義了安裝包的資訊。是以還是比較語義化的,繼續探索。
以上隻是個人小結,難免有所不當,歡迎指正,如果對你有幫助,請幫忙頂一下。:)