2015-04-01 150 views
0

我有一個wpf應用程序,它可以幫助用戶選擇目錄路徑,當他點擊創建安裝程序按鈕時,我想爲用戶選擇的目錄創建安裝程序(在目錄裏面可能有我多個文件)。wix#創建安裝程序的腳本

我開始知道我可以使用wix腳本,然後在點擊按鈕時調用此腳本。但我不知道如何編寫一個wix#腳本,它爲文件輸入(該安裝程序的文件將要創建)。

我家有基本的wix和新的wix#。請幫我解決我的問題。

回答

1

你可以試試Wixsharp解決方案。

你可以從Nuget參考選項(Visual Studio)中獲得它,然後你只需要編寫代碼,以便它可以像你想要的那樣工作。

我將做一個C#示例:

static string sRootDir = @"<Path of Source directory>"; 
static void BuildMSI() 
     {         
      WixEntity[] weDir = new WixEntity[0]; 
      weDir = BuildDirInfo(sRootDir, weDir); 
      var project = new Project("My product", weDir) 
      { 
       GUID = Guid.NewGuid(), 
       //UI = WUI.WixUI_InstallDir, 
       Version = new Version(55, 0, 0, 0), 
       UpgradeCode = guidUpgradeCode, // Forwarded if upgrading existing product 
       MajorUpgradeStrategy = new MajorUpgradeStrategy 
       { 
        UpgradeVersions = VersionRange.OlderThanThis, 
        PreventDowngradingVersions = VersionRange.NewerThanThis, 
        NewerProductInstalledErrorMessage = "Newer version already installed" 
       } 
      }; 

      project.BuildMsi(project); 
     } 



static WixEntity[] BuildDirInfo(string sRootDir, WixEntity[] weDir) 
     { 
      DirectoryInfo RootDirInfo = new DirectoryInfo(sRootDir); 
      if (RootDirInfo.Exists) 
      { 
       DirectoryInfo[] DirInfo = RootDirInfo.GetDirectories(); 
       List<string> lMainDirs = new List<string>(); 
       foreach (DirectoryInfo DirInfoSub in DirInfo) 
        lMainDirs.Add(DirInfoSub.FullName); 
       int cnt = lMainDirs.Count; 
       weDir = new WixEntity[cnt + 1]; 
       if (cnt == 0) 
        weDir[0] = new DirFiles(RootDirInfo.FullName + @"\*.*"); 
       else 
       { 
        weDir[cnt] = new DirFiles(RootDirInfo.FullName + @"\*.*"); 
        for (int i = 0; i < cnt; i++) 
        { 
         DirectoryInfo RootSubDirInfo = new DirectoryInfo(lMainDirs[i]); 
         if (!RootSubDirInfo.Exists) 
          continue; 
         WixEntity[] weSubDir = new WixEntity[0]; 
         weSubDir = BuildDirInfo(RootSubDirInfo.FullName, weSubDir); 
         weDir[i] = new Dir(RootSubDirInfo.Name, weSubDir); 
        } 
       } 
      } 
      return weDir; 
     }