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即可
在这里插入图片描述

十五、设置自定义操作执行时间和顺序,可以选中后设置,安装时执行,或者卸载时执行,并且可以在左侧调整执行顺序。
在这里插入图片描述

十六、构建安装包,回到产品详细页面,点击构建即可。构建完成后就能在你设置的输出位置看到构建好的安装包。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/88958.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/88958.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/88958.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代数基本定理

代数基本定理 多项式 f(z)anznan−1zn−1⋯a1za0f(z) a_n z^n a_{n-1} z^{n-1} \cdots a_1 z a_0f(z)an​znan−1​zn−1⋯a1​za0​(其中 n>1n > 1n>1 且 an,a0≠0a_n,a_0 \neq 0an​,a0​0)在复数域内有根。 约定 以 ttt 为参数的闭曲…

springboot快速集成对接本地Ollama里的Deepseek-R1

书接上回,我们在本地安装了一个Ollama,然后下载了一个deepseek-r1:7b,传送门 本次目标:使用springboot对接ollama,完成简单api对接 1.创建一个项目,选择JDK17,Spring Boot版本3.5.3&#xff0c…

Docker部署私有仓库

环境信息 centos7:docker26.1.4 IP:192.168.12.134 部署harbor wget https://github.com/goharbor/harbor/releases/download/v2.13.1/harbor-offline-installer-v2.13.1.tgz curl -L "https://github.com/docker/compose/releases/download/1.29.2…

张艺兴探班RED女团一周年舞台,见证21岁的梦想落地生根

从青涩的男团偶像,到如今独当一面的音乐制作人、公司老板,张艺兴的每一步都踏得坚定有力,他的故事充满了热血与梦想的色彩。而最近,他探班RED女团一周年舞台现场的举动,又一次成为粉丝和大众热议的焦点,也让…

网络编程 JAVA

一.网络编程1. 什么是网络编程?网络编程是指利用计算机网络实现程序之间通信的一种编程方式。在网络编程中,程序需要通过网络协议(如 TCP/IP)来进行通信,以实现不同计算机之间的数据传输和共享。2. 三个基本要素①IP …

UE5中的cesium

官方Fab地址(https://www.fab.com/zh-cn/),每月可下载免费素材 在UE5中添加插件cesium for unreal, 知识点一:服务器部署.b3dm地形数据 通过在线链接访问数据目录tileset.json,在cesium for unreal添加空白…

持续优化小程序排名,稳定获取搜索流量

一、建立动态关键词管理机制周期性关键词迭代每月通过平台搜索分析工具(如微信小程序后台)抓取用户搜索词趋势,淘汰搜索量下降的关键词,补充行业热点词与长尾需求词。按 “核心词 季节 / 场景词” 动态调整名称与简介&#xff08…

MyBatis 进阶:连接池、动态 SQL 与多表关联查询

MyBatis 作为一款灵活的持久层框架,除了基础的 CRUD 操作,还提供了连接池管理、动态 SQL 以及多表关联查询等高级特性。本文将从连接池原理出发,深入讲解动态 SQL 的常用标签,并通过实例演示一对多、多对多等复杂关联查询的实现&a…

反射型跨站点脚本(XSS)漏洞中网络安全防火墙(WAF)被绕过进行内容植入与远程劫持机制分析

在一次安全测试中&#xff0c;我发现目标站点在错误处理页面对用户输入的查询参数名未做任何转义&#xff0c;当参数名中包含 <script> 标签时&#xff0c;页面会原样渲染并执行其中的 JavaScript。本文将从实战角度&#xff0c;详细讲解如何定位该反射型 XSS 漏洞、通过…

RAG实战指南 Day 15:多语言与领域特定嵌入技术

【RAG实战指南 Day 15】多语言与领域特定嵌入技术 引言 欢迎来到"RAG实战指南"系列的第15天&#xff01;今天我们将深入探讨多语言与领域特定嵌入技术——这是构建全球化、专业化RAG系统的关键技术。在现实业务场景中&#xff0c;我们经常需要处理多种语言的文档&a…

无铅PCB和无卤pcb有什么区别?

在电子制造领域&#xff0c;环保法规的升级催生了多种特殊工艺的PCB产品。其中&#xff0c;无铅PCB与无卤PCB作为两大主流方向&#xff0c;虽同属绿色制造范畴&#xff0c;却在技术路径与应用场景上存在本质差异。环保指向的根本区别无铅PCB的核心在于焊接材料的革新。传统PCB采…

基于51单片机的贪吃蛇游戏Protues仿真设计

目录 1 系统设计目的 2 系统实现功能 3 系统硬件设计 3.1系统设计框图 3.2 液晶显示模块LCD12864 3.3 按键输入模块 3.4 时钟电路和复位电路 4 系统软件设计 4.1系统软件流程 4.2 游戏引擎模块程序设计 4.3 显示模块程序设计 4.4 输入处理模块程序设计 5 系统仿真…

HTML+CSS

一、HTML相关内容- <img> 标签&#xff1a;- 用于在网页中嵌入图像&#xff0c; src 属性指定图像的路径&#xff0c;可以是绝对路径&#xff08;如 D:\Git\java115_java116\课堂代码\前端代码\pic\cat.jpg &#xff09;、相对路径&#xff08;如 ./pic/cat.jpg &#x…

基于 Gitlab、Jenkins与Jenkins分布式、SonarQube 、Nexus 的 CiCd 全流程打造

前言 在当今数字化飞速发展的时代&#xff0c;软件开发与交付的效率和质量成为了企业竞争的关键要素。为了满足市场对软件快速迭代和高质量交付的需求&#xff0c;越来越多的企业开始探索和实践持续集成与持续交付&#xff08;CI/CD&#xff09;的开发模式。而 GitLab、Jenkin…

[密码学实战]密评相关题库解析

[密码学实战]密评相关题库解析 一、背景 依据《密码法》第二十二条&#xff0c;关键信息基础设施&#xff08;关基&#xff09;运营者必须开展商用密码应用安全性评估&#xff0c;且需定期进行&#xff08;不少于每年一次&#xff09;。 二、核心解析 2.1 测评标准框架&#x…

谷歌开源库gflags详细说明

目录 一.gflags 介绍 二.gflags安装 三.gflags使用 1.包含头文件 2.定义参数 3.访问参数 4.不同文件访问参数 5.初始化所有参数 6.运行参数设置 7.配置文件的使用 8.特殊参数标识 四.总结 一.gflags 介绍 gflags 是 Google 开发的一个开源库&#xff0c;用于 C 应用…

Python爬虫实战:研究XlsxWriter 库相关技术

1. 研究背景与意义 1.1 网络爬虫技术价值 网络爬虫作为数据采集的核心工具,在金融、医疗、教育等领域发挥关键作用。据 Statista 数据显示,2025 年全球大数据市场规模预计达 3250 亿美元,高效的数据获取能力成为企业核心竞争力。Python 以其 80% 的市场占有率成为爬虫开发首…

ThreadLocal内部结构深度解析(Ⅰ)

目录 使用ThreadLocal 例子 内部结构分析 源码解析 图示详解 ThreadLocal是Java中一个非常重要且常用的线程局部变量工具类&#xff0c;它使得每个线程可以独立地持有自己的变量副本&#xff0c;而不是共享变量&#xff0c;解决了多线程环境下变量共享的线程安全问题。下面我…

Python 数据挖掘之数据探索

在数据挖掘的流程中&#xff0c;数据探索是非常关键的第一步&#xff0c;它能帮助我们深入了解数据的特点&#xff0c;为后续的预处理和模型构建打下坚实的基础。我们主要围绕四个方面展开&#xff1a;数据对象与特征、数据统计描述、数据可视化以及相关性和相似性度量。一、数…

高并发点赞场景Synchronized、AtomicLong、LongAdder 和 LongAccumulator性能分析

在高并发点赞场景中&#xff0c;我们需要一个高效、线程安全的计数器来记录点赞数。synchronized、AtomicLong、LongAdder 和 LongAccumulator 都是 Java 中用于实现原子操作的类&#xff0c;但它们的性能在高并发下差异显著。性能主要取决于线程竞争程度&#xff1a;竞争越高&…