Unity发布Windows平台后通过Advanced Installer制作安装包_advance installer
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即可
十五、设置自定义操作执行时间和顺序,可以选中后设置,安装时执行,或者卸载时执行,并且可以在左侧调整执行顺序。
十六、构建安装包,回到产品详细页面,点击构建即可。构建完成后就能在你设置的输出位置看到构建好的安装包。