這次發布的是這兩天做的一個WIX工具QuickWIX,主要解決兩個問題點1.對大文件快速生成wix標簽(files,Directories,ComponentRef);2.比較前后兩次工程的差異。大的WIX工程有好幾千個文件,開發人員增加dll,或者資源文件都是不確定的,而且很多時候我們無法直接取代,所以需要一個對比的功能,來告訴打包人員哪里新增了,哪里刪除了,這樣加快打包速度。
一、介紹
工具是個簡單的winform程序。下面做幾點說明。

1.生成XML:會更具路徑和變量信息,生成Fragment,Feature和Directory。
2.對比:找出差異的文件、目錄和組件信息:

3.自動保存最新工程:如果選中,在對比的時候就會把當前工程的信息保存下來。
4.保存:手動保存當前工程信息
5.目錄:當前工程的目錄信息。
6.組件:當前工程的組件信息。
7.目錄:當前工程的目錄信息。
二、原理
1.工程目錄如下,所有WIX先關對象都繼承IWixBase接口。

用於生成對象本身的WIX標簽。這樣在有子類的時候,調用子類的ToWixString()方法即可。
public interface IWixBase { /// <summary> /// 返回wix標簽 /// </summary> /// <returns></returns> string ToWixString(); }
2.WixProj包含WixDirectory,WixFragment,WixFeature,是Wix對象最父類的元素。也是用來保存xml的對象。
[Serializable] public class WixProj : IWixBase { private WixDirectory _wixDirectory; private WixFragment _wixFragment; private WixFeature _wixFeature; /// <summary> /// 比較Directory /// </summary> public WixDirectory WixDirectory { get { return _wixDirectory??(_wixDirectory=new WixDirectory()); } set { _wixDirectory = value; } } /// <summary> /// 比較Files /// </summary> public WixFragment WixFragment { get { return _wixFragment??(_wixFragment=new WixFragment()); } set { _wixFragment = value; } } /// <summary> /// 比較ComponentRef /// </summary> public WixFeature WixFeature { get { return _wixFeature??(_wixFeature=new WixFeature()); } set { _wixFeature = value; } } public string ToWixString() { var sb = new StringBuilder(); sb.Append(WixFragment.ToWixString()); sb.Append("\r\n"); sb.Append("\r\n"); sb.Append(WixDirectory.ToWixString()); sb.Append("\r\n"); sb.Append("\r\n"); sb.Append(WixFeature.ToWixString()); return sb.ToString(); } }
調用它的ToWixString方法就可以獲得整個工程wix元素。
3.WixComparator,就是用來比較工程用的,包含兩個WixProj對象,一個用來加載xml,一個即當前工程。
它的BeginCompare方法就是用來開始比較差異的。也是分三個部分去比較。比如對於files 要比較出新增的、刪除的和修改的。目錄和組件不包含修改部分(他們就一個id)。
/// <summary> /// 開始比較 /// 返回files差異 /// 返回Components差異 /// 返回Directory差異 /// </summary> /// <returns>比較結果</returns> public string BeginCompare() { //先比較files //就需要比較目錄 //如果之前的不存在 就不必要比較 if (BeforeWixProj==null) { return "---舊工程不存在---\r\n"; } var sb = new StringBuilder(); sb.Append(CompareDirectoryRefs()); sb.Append(CompareDirectory()); sb.Append(CompareComponeRefs()); if (sb.Length == 0) { sb.Append("\r\n 這兩個工程文件一致! "); } return sb.ToString(); }
而其他wix對象都有一個Compare方法。用來和同類型的對象比較。該對象在GenerateWiXml類中進行初始化。
4.Wixconfig中包含一些配置信息,比如注冊文件、過濾后綴,初始組件等。
小結:接下來的想法是能夠在打包工程編譯之前就自動修改好wxs文件,不然每次要打開工程修改確實麻煩。下面是源代碼,有興趣的一起折騰交流。希望本文對你有幫助。
http://pan.baidu.com/s/1ntmolhZ
