Wix的xml配置確實很費勁,忍不住有點像吐槽一下,前四篇完成的功能在Windows Installer中通過配置能很快的弄出來。可惜有很多加了鎖的功能在InstallShield Limited Edition 版本中是用不了的。 但基本滿足安裝需求了。按照這個目錄(下圖)一個一個去配,配出來的也像樣了(這里就不說了)。但是無法定制行為,以及打補丁等。wix又是一個極端,完全依賴xml。這兩天想解決自動檢測.net framework版本沒有就自動安裝的功能和注冊dll的就很費勁。 在Windows Installer中分別在Redistributables和Registry中設置就行了,特別是注冊,可以直接把目錄從你自己的電腦上拖過來。但今天要講的,就是wix中的Bootstrapper 項目,制作一個捆綁安裝程序,也是Windows Installer中沒有的。將多個需要安裝的文件,按照順序一次性裝完。

一、Bootstrapper 初識
起因:wix的Setup 項目是無法自動安裝.net framework的,必須要通過bootstrapper 應用程序去驅動wix中的Burn引擎來安裝。在wix中只能判斷有無合適的版本再終止安裝。前提是要引入WixNetFxExtension.dll。xml代碼如下
<PropertyRef Id="NETFRAMEWORK40FULL"/>
<Condition Message="This application requires .NET Framework 4.0"> <![CDATA[Installed OR NETFRAMEWORK40FULL]]> </Condition>
所以需要新建一個bootstrapper 項目

會生成一個Bundle的wxs文件 支持四種文件格式
View Code
二、如何捆綁
目的:檢測.net版本,沒有匹配的就自動安裝,然后再安裝我們自己的工程。
1.先在Bootstrapper工程中引用WixNetFxExtension.dll 這個動態鏈接庫中 已經包含了各種.net 版本
2.在Chain 元素中添加安裝清單。
<Chain>
<PackageGroupRef Id="NetFx40Web"/>
<MsiPackage Id="Scada" SourceFile="D:\VS2012\SCADASetup\SCADASetup\bin\Debug\SCADASetup.msi"></MsiPackage>
</Chain>
這里PackageGroupRef Id的意思就是沒有.Net Framework4.0就從web上下載了安裝,當然你如果安裝了4.5,這個是向下兼容的,不會再給你裝一個4.0。其他版本的如下所示:
| NetFx40Web |
.Net Framework 4.0 Full web setup. |
| NetFx40Redist |
.Net Framework 4.0 Full standalone setup. |
| NetFx40ClientWeb |
.Net Framework 4.0 Client Profile web setup. |
| NetFx40ClientRedist |
.Net Framework 4.0 Client Profile standalone setup. |
| NetFx45Web |
.Net Framework 4.5 web setup. |
| NetFx45Redist |
.Net Framework 4.5 standalone setup. |
這里的MsiPackage就是我們自己的打包工程,會在.net版本確定之后安裝,且地址對就行了,沒有必要復制到根目錄下,生成的時候他會自動一個exe安裝文件。 但是 所以在Bootstrapper中的安裝程序都是沒有窗口的。安裝順序一個個默默的裝完,沒有上一步,下一步。和Click Once部署的一樣。一次性裝完。


如果要讓MSI安裝文件顯示界面,要設置屬性DisplayInternalUI為yes 就可以看展示出界面了
<PackageGroupRef Id="NetFx40Web"/>
<MsiPackage SourceFile="$(var.MSIPath)SCADASetupWix.msi" DisplayInternalUI="yes" />
3.安裝文件設置。
上面就是一個簡單的捆綁安裝程序了,我們還可以進一步配置。 可以現在Fragment元素中把文件先設置好,在加入到鏈表中。
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:bal="http://schemas.microsoft.com/wix/BalExtension"
xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension"
xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
<Bundle Name="DIAView" Version="1.0.0.0" Manufacturer="Delta" UpgradeCode="87714fb5-9cdb-4323-af55-821c05974378" IconSourceFile="$(var.Photoes)diaapp.ico" Compressed="yes" >
<BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense" >
<bal:WixStandardBootstrapperApplication LicenseFile="$(var.Photoes)license.rtf" LogoFile="$(var.Photoes)dialogo.jpg" />
</BootstrapperApplicationRef>
<!--<BootstrapperApplicationRef Id="ManagedBootstrapperApplicationHost"> IconSourceFile="$(var.Photoes)diaapp.ico"
<bal:WixStandardBootstrapperApplication LicenseFile="$(var.Photoes)license.rtf" LogoFile="$(var.Photoes)scon.ico" />
</BootstrapperApplicationRef>-->
<Chain>
<!--<PackageGroupRef Id="NetFx40Web" />-->
<PackageGroupRef Id="Netfx4Full" />
<MsiPackage Id="DIAView" SourceFile="$(var.Dia)DIAViewSetUp.msi" Compressed="no" DisplayInternalUI="yes"/>
</Chain>
</Bundle>
<Fragment>
<!--<PackageGroup Id="Netfx4Full">
<ExePackage Id="Netfx4Full" Cache="no" Compressed="no" PerMachine="yes" Permanent="yes" Vital="yes" InstallCommand="/q"
SourceFile="$(var.Dia)dotNetFx40_Full_x86_x64.exe"
DetectCondition="(Netfx4FullVersion="4.0.30319") AND (NOT VersionNT64 OR (Netfx4x64FullVersion="4.0.30319"))"
DownloadUrl="http://go.microsoft.com/fwlink/?LinkId=164193"
InstallCondition="(VersionNT >= v5.1 OR VersionNT64 >= v5.1) AND (NOT (Netfx4FullVersion="4.0.30319" OR Netfx4x64FullVersion="4.0.30319"))"/>
</PackageGroup>-->
<util:RegistrySearchRef Id="NETFRAMEWORK40"/>
<PackageGroup
Id="Netfx4Full">
<ExePackage
Id="Netfx4FullExe"
Cache="no"
Compressed="no"
PerMachine="yes"
Permanent="yes"
Vital="yes"
SourceFile="$(var.Dia)dotNetFx40_Full_x86_x64.exe"
InstallCommand="/q /norestart "
DetectCondition="NETFRAMEWORK40"
DownloadUrl="http://go.microsoft.com/fwlink/?LinkId=164193"/>
</PackageGroup>
</Fragment>
</Wix>
(注釋部分的檢測.net4.0有問題,每次都會裝一次.net4.0 甚至會在32位系統中造成重啟。)
ExePackage 就是專門針對exe文件,MsiPackage正對msi文件,其他以此類推。說幾個重要的屬性:Compress=“yes” 表示是壓縮,no的話,debug中這個安裝包就會獨立出來,全部是yes的話最終就一個exe文件。

Permanent="yes" 表示如果是卸載的話,這個文件會保留,為no的話,用戶卸載的時候會一起卸載掉。VersionNT 變量代表系統,5.1指的是xp
4.判斷是否注冊。
我們用RegistrySearch來搜索注冊表,切可以制定檢測順序
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
<Fragment>
<util:RegistrySearch Id="Path"
Variable="UniqueId"
Root="HKLM,SOFTWARE\Microsoft\MyProduct\Unique Id\"
Key="Product"
Result="Value" />
<util:RegistrySearch
Variable="patchLevel"
Root="HKLM,SOFTWARE\Microsoft\MyProduct\[UniqueId]\Setup"
Key="PatchLevel"
Result="Exists"
After="Path" />
</Fragment>
</Wix>
這里的表示的就是在執行Path之后在執行第二個注冊表搜索,且結果你存儲在Variable中的,而這個Variable就可以作為,是否安裝的一個條件。
<ExePackage
SourceFile="[sources]\packages\shared\MyPackage.exe"
DownloadURL="http://mywebdomain.com/?mypackage.exe
InstallCommand="/q /ACTION=Install"
RepairCommand="/q ACTION=Repair /hideconsole"
UninstallCommand="/q ACTION=Uninstall /hideconsole "
InstallCondition="x86 = 1 AND OSVersion >= v5.0.5121.0 AND patchLevel = 0" />
</PackageGroup>
這種一次性安裝的方式還是覺得不太好,有些強制性。這里只做個簡單的參照。
很多PC軟件都是可以自動檢測版本,下載更新,VS自帶的ClickOnce也可以運行前自己動檢測,發現新版本會去提示下載更新,需要借助一個發布網站就行。但那個可配置性就更 低了。應該還有其他的方法,求路過大俠指點一二。

