Unity發布Windows平臺后是一堆庫資源,以及一個可執行的exe文件,并不是一個安裝包,如果需要制作成安裝包,需要再進一步打包,本篇文章介紹一個Advanced Installer的軟件,專門用來制作Windows平臺的安裝包的。夸克網盤鏈接:https://pan.quark.cn/s/ae2f834ae61a
里面分別是三個文件,(第一個是Advanced Installer)第二第三個文件是自定義Advanced Installer事件的VS插件(如果需要用到,就需要安裝這兩個插件)。
一、打開后選擇對應應用程序,新建項目
二、填寫信息,分別是應用名稱,版本,發布者,下方的控制面板根據需求是否開啟(應用名稱這邊截圖中填寫的是屬性變量對應的屬性頁面設置的)
屬性頁
三、導入需要打包的應用程序
四、設置開始菜單和桌面快捷方式(如有需求,沒需求也可以不設置)選中需要創建的快捷方式的文件,右鍵創建,然后將快捷方式存放至桌面以及開始菜單中
五、注冊表的設置(如有需要,例如開機自啟,其實就是把應用信息寫入注冊表,以及網頁打開應用也是需要把信息寫入注冊表,網頁打開應用后續會單獨寫一篇文章)
六、設置安裝參數,安裝文件夾指的是打開安裝包選擇安裝位置時默認的位置,圖片中指向的C盤的路徑,下面的安裝選項中:靜默安裝勾選后,就不會再跳出選擇框等一些設置,直接會出現進度條進行安裝,因此正常安裝包需要勾選,除非你發布的是冷更新的安裝包(后續會單獨出一遍文章,寫冷更新的操作),管理員身份運行,建議勾上,有些操作必須管理員權限才能操作,例如在注冊表的Root中寫入信息,必須要管理員權限才行,不勾選這種操作就不能正常執行。
七、設置構建信息,導出安裝包保存位置,一個是exe的文件名,以及exe的圖標
八、運行環境和啟動條件(根據需求修改)
九、設置對話框,主題也就是對話框的不同默認的樣式,對話框可以全部刪除后自定義,主要可能涉及到的就是最后完成安裝后,可能需要打開描述文件,或者直接啟動應用程序,以及以管理員身份運行等。因此需要設置啟動文件
十、最后設置自定義操作,為什么需要這個呢,是因為安裝包,安裝后如果需要卸載,他不會把文件夾下涉及到的文件全部卸載掉。因此需要自行編寫一段刪除文件的腳本。
十一、編寫腳本文件流程(注意我這邊使用的VS2022,C#編寫的,也可以使用其他的,請自行研究)
這時候就需要用到開頭提供的另外兩個文件,安裝完成后,打開VS新建項目(選擇 C# Custom Action Project for WiX v3)注意如果那兩個文件沒安裝成功,是不會顯示該模塊項目的。
十二、在CustomAction1中編寫對應的執行事件即可,例如卸載應用后刪除指定文件,那么怎么獲取指定文件位置,可以通過注冊表中的信息獲取。注冊表中的信息,怎么寫入呢畢竟也不是一開始就有的,這時候就有兩種寫入方式,一種就是上方提到的在安裝時設置好,直接寫入即可,第二種代碼運行后寫入。(以下代碼僅供參考,具體需要執行什么事件自行編寫)
using Microsoft.Deployment.WindowsInstaller;
using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;namespace AdvancedInstallerCustomAction
{public class CustomActions{[CustomAction]public static ActionResult CustomAction1(Session session){session.Log("Begin CustomAction1");string manufacturer = session["Manufacturer"];string productName = session["ProductName"];using (RegistryKey handlerKey = Registry.CurrentUser.OpenSubKey($"SOFTWARE\\{manufacturer}\\{productName}")){if (handlerKey != null){string value = (string)handlerKey.GetValue("Path");if (!string.IsNullOrEmpty(value)){//var path = Path.Combine(value, productName);RemoveSubDirectory(value, false);}} }var desktopShutout = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), $"{productName}.lnk");RemoveFile(desktopShutout);var startMenuShutout = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Programs), productName);RemoveSubDirectory(startMenuShutout);return ActionResult.Success;}private static void RemoveFile(string path){FileInfo file = new FileInfo(path);try{if (file.Exists){file.Delete();}}catch{return;}}private static void RemoveSubDirectory(string path,bool isDeleteRoot=true){DirectoryInfo uper = new DirectoryInfo(path);try{if (uper.Exists){foreach (FileInfo subFile in uper.GetFiles()){subFile.Delete();}foreach (DirectoryInfo sub in uper.GetDirectories()){if (sub.GetFiles().Length > 0 || sub.GetDirectories().Length > 0)RemoveSubDirectory(sub);}if (isDeleteRoot) uper.Delete(true);}}catch{return;}}private static void RemoveSubDirectory(DirectoryInfo uper, bool isDeleteRoot = true){try{if (uper.Exists){foreach (FileInfo subFile in uper.GetFiles()){subFile.Delete();}foreach (DirectoryInfo sub in uper.GetDirectories()){if (sub.GetFiles().Length > 0 || sub.GetDirectories().Length > 0)RemoveSubDirectory(sub);}if (isDeleteRoot) uper.Delete(true);}}catch{return;}}}
}
十三、生成dll,點擊生成=》生成解決方案(或者點擊重新生成解決方案)生成完后,下面會告訴你dll地址
十四、應用dll文件。點擊添加自定義操作,通過DLL,選擇剛生成的dll即可
十五、設置自定義操作執行時間和順序,可以選中后設置,安裝時執行,或者卸載時執行,并且可以在左側調整執行順序。
十六、構建安裝包,回到產品詳細頁面,點擊構建即可。構建完成后就能在你設置的輸出位置看到構建好的安裝包。