3-Visual Studio 2022打包NET开发项目为安装包
引言
本文将上一期博文>>>门店管理系统开发<<<开发的项目打包为Windows安装包
一,安装扩展
安装此扩展:installer Projects


二,创建安装程序项目
创建项目
右键解决方案-添加-新建项目

选择setup Project项目

填写项目名称后点创建即可来到此页面

二,配置安装程序项目
默认会打开文件系统视图,也可以通过右击Setup项目,选择“View” -> “文件系统”。

1,添加应用程序文件
Application Folder文件夹内需要包含原项目的所有静态资源,命名需要保持一致。右击“Application Folder”,选择“Add”,可以按需添加文件和文件夹。推荐直接粘贴。 添加项目主输出。
将原项目中的“Resources”文件夹,复制到Setup项目的“Application Folder”文件夹下。
右击“Resources”,选择“在文件资源管理器中打开文件夹”,定位到需要复制的文件夹,右击“复制”。最后再右击“Application Folder”,选择“粘贴”即可。

我这里面没有静态资源,就不复制了。

如果有,就复制,然后回到VS页面,右键Application Floder-粘贴即可。

在文件系统视图中,右击“Application Folder”,选择“Add” -> “项目输出”。


在弹出的窗口中,选择需要打包的项目,选择“主输出”,点击“确定”即可。这将添加你的应用程序的可执行文件及其依赖项到安装程序项目中。


2,配置安装位置
右键点击“Application Folder”,选择“属性窗口”,可以设置默认的安装路径。
默认路径为
[ProgramFilesFolder][Manufacturer]\[ProductName]


Manufacturer和ProductName可以在项目属性里设置。
单击Setup项目,即可出现以下属性窗口,建议修改的属性有:卸载程序图标/作者/制造商/项目名称/标题。(tip:项目名称和标题建议去除Setup字样,因为后续会显示在windows的程序菜单名称里)

右侧部分必要参数详解


添加项目图标,上传按照上述复制步骤执行即可

2,创建快捷方式
右击“主输出”,选择“Create Shortcut to 主输出.....”,重命名为项目名称即可。然后将其拖拽到“User‘s Desktop”文件夹下。



重复上述操作,再创建一个快捷方式,将其拖拽到“User’s Programs Menu”文件夹下。

给两个快捷方式都设置应用图标,单击快捷方式,在属性窗口中,设置icon路径。icon图标,需要提前放在应用程序文件夹(Application Folder)中。


3,创建卸载程序
注意:msiexec.exe是 Windows 的内置程序,用于安装、修改和卸载软件包。它通常位于系统目录中。具体路径是C:\Windows\System32\msiexec.exe
在本地Windows资源管理器中,复制该“msiexec.exe”文件

将其粘贴至“Application Folder”文件夹下。

将其重命名为“卸载xxx”后,右击创建快捷方式。


单击Setup项目,在项目属性页签,复制ProductCode产品唯一标识符GUID的值。

GUID值可以刷新


{7377ECF3-***************D0C5DCA6273F}复制后点ok即可。

在创建的快捷方式属性中,将ProductCode的值粘贴过来,修改Arguments的值为: /x {7377ECF3-***************D0C5DCA6273F} 注意/x后有一个空格,名称/描述/图标 等属性都可以根据需要更改。


在“User's Programs Menu”文件夹下,再创建一个文件夹“Beginner Guide”,用于存放程序快捷方式和卸载程序快捷方式。将原本的程序快捷方式和刚刚创建的卸载程序快捷方式都拖拽进文件夹“Beginner Guide”下,并重命名为项目名称。


4,配置启动条件
在解决方案资源管理器中,右击Setup项目,选择“View” -> “启动条件”。

在启动条件视图中,可以添加或修改安装前的条件检查。例如,检查 .NET Framework 版本。右击“Launch Conditions”视图中的空白处,选择“添加启动条件”。

在属性窗口中,可以设置启动条件的属性,例如“条件”、“消息”等。条件可以是操作系统版本、系统权限、特定文件或注册表键是否存在等。
5,生成和发布安装包
在菜单栏单击“生成”,选择“配置管理器”,在弹出的窗口中,选择“Release”配置,并且将Setup项目的“生成”也打上勾。配置完毕,关闭该窗口。
防止在之前的开发调试过程中,已经生成过解决方案产生冲突,这里先点击“清理解决方案”,再点击“重新生成解决方案”。
检查输出窗口,确保生成成功。如果有任何错误信息,需要修正这些错误并重新生成。
生成成功后,右击Setup项目,选择“在文件资源管理器中打开文件夹”,即可看到有两个文件夹Debug和Release。
刚刚在“生成”的“配置管理器”中选择的是Release,此处打开“Realease”文件夹,即可看到生成的安装程序。将后缀为msi的文件分发给他人即可直接安装。
MSI和EXE是两种常见的Windows安装程序格式,它们在设计目标、工作机制和适用场景上有显著区别:
文件结构与技术原理 特性 MSI(Windows Installer Package) EXE(可执行安装程序) 核心原理 基于数据库的安装包(表结构存储组件、文件、注册表等信息) 自解压可执行文件(可能是脚本、二进制或第三方打包工具生成) 依赖服务 依赖Windows Installer服务(msiexec.exe) 不依赖特定服务,独立运行 标准化程度 微软官方标准格式,严格遵循Windows安装规范 格式自由,取决于打包工具(如Inno Setup、InstallShield)
安装与维护行为 特性 MSI EXE 事务回滚 支持原子操作,安装失败自动回滚到初始状态 依赖打包工具实现,通常无事务保障 静默安装 标准化命令: msiexec /i package.msi /quiet需要特定参数(如 /S、/VERYSILENT),格式不统一修复/卸载 通过控制面板或命令行统一管理( msiexec /f或/x)依赖打包工具逻辑,可能需独立卸载程序 更新机制 支持补丁包(.msp)和升级规则 通常需重新安装完整包
部署与管理能力 特性 MSI EXE 企业部署 原生支持组策略(GPO)、SCCM、Intune批量部署 需借助脚本或第三方工具实现批量安装 自定义 通过转换文件(.mst)修改安装参数,或使用Orca编辑 可直接修改安装脚本(如NSIS、Inno Setup脚本) 权限控制 强制要求管理员权限 可配置为普通用户权限(但可能受系统策略限制)
典型应用场景 场景 MSI适用场景 EXE适用场景 企业环境 ✔️ 大规模软件分发
✔️ 标准化软件生命周期管理❌ 仅限小范围或临时部署 开发者需求 ❌ 需学习MSI打包工具(如WiX) ✔️ 快速打包(如单文件工具)
✔️ 灵活定制安装界面和逻辑用户友好性 ❌ 默认界面简单,需定制复杂 ✔️ 支持炫酷安装界面、多语言、进度动画 兼容性 ✔️ 深度集成Windows系统(如注册表、服务管理) ❌ 依赖打包工具的实现质量
安全与审计 特性 MSI EXE 数字签名 可对包内文件逐个签名 通常仅整体签名 日志记录 自动生成详细日志( msiexec /l*v install.log)依赖打包工具实现,日志格式不统一 恶意软件风险 ✔️ 因标准化结构更易被安全软件分析 ❌ 可能隐藏恶意代码(如捆绑安装) .技术选型建议:
选择MSI:
✅ 企业级软件分发
✅ 需要严格版本控制和升级管理
✅ 依赖Windows深度集成功能(如服务、注册表)选择EXE:
✅ 个人开发者或小型项目
✅ 需要高度定制安装界面和交互逻辑
✅ 快速打包简单应用(如便携工具)混合方案
实际场景中常采用 EXE封装MSI(如
Setup.exe引导程序)以兼顾两者优势:
EXE负责运行时检测(如.NET Framework依赖)
调用MSI执行实际安装
提供友好的用户界面和错误处理
通过理解这些差异,您可以根据项目需求(如部署规模、维护复杂度、用户体验)选择最合适的安装包格式。
示例代码:
# 示例:静默安装封装后的EXE Setup.exe /S /v"/qn INSTALLDIR=\"C:\Program Files\""
三,测试
准备一个Windows11测试环境,并将两个安装文件导入至测试 环境中。

1,安装





2,运行

(这里因为数据库是在开发设备上,并没有部署在公共服务器,所以启动会报错或者不显示数据,属于正常现象)




成功。
3,删除




成功。
最后附上本项目gitee仓库
root/会员管理系统
相关文章:
3-Visual Studio 2022打包NET开发项目为安装包
引言 本文将上一期博文>>>门店管理系统开发<<<开发的项目打包为Windows安装包 一,安装扩展 安装此扩展:installer Projects 二,创建安装程序项目 创建项目 右键解决方案-添加-新建项目 选择setup Project项目 填写项目名…...
国内外网络安全政策动态(2025年3月)
▶︎ 1.《关于进一步加强智能网联汽车产品准入、召回及软件在线升级管理的通知》发布 3月1日,工业和信息化部、市场监管总局联合发布《关于进一步加强智能网联汽车产品准入、召回及软件在线升级管理的通知》(以下简称《通知》)。 该通知旨在…...
Kafka 和 Flink的讲解
一、Kafka:分布式消息队列 1. 核心概念 角色:Kafka 是一个分布式、高吞吐量的消息队列(Pub-Sub 模型),用于实时传输数据流。关键术语: Producer(生产者):发送数据的客户端(如传感器、应用日志)。Consumer(消费者):接收…...
已知Word内容格式固定,通过宏实现Word转Excel
文章目录 需求描述一、宏是什么?二、使用步骤1.启用开发工具2.VBA基础知识3.单个Word文件转为Excel4.批量将Word文件转为Excel文件 总结 需求描述 现在有多个Word文档,Word文档格式固定,假如Word内容分为单选题和多选题,每个题目…...
一文详解OpenGL环境搭建:Ubuntu20.4使用CLion配置OpenGL开发环境
在计算机图形学的广阔领域中,OpenGL作为行业标准的图形库,为开发者提供了强大的工具集来创建从简单的2D图形到复杂的3D世界。然而,对于初学者而言,配置一个合适的开发环境是迈向成功的第一步。本文将详细介绍如何在Ubuntu 20.04.3 LTS操作系统上搭建基于CLion的OpenGL开发环…...
Java面试黄金宝典41
1. IO 种类 定义 在 Java 里,IO(输入 / 输出)主要分为字节流和字符流这两种类型。字节流以字节为单位处理数据,适合处理二进制数据,像图片、音频、视频等;字符流以字符为单位处理数据,适用于处理文本数据。 要点 字节流处理二进制数据,字符流处理文本数据。字节流的基类…...
边缘计算革命:低功耗GPU在自动驾驶实时决策中的应用
边缘计算革命:低功耗GPU在自动驾驶实时决策中的应用 ——分析NVIDIA Jetson与华为昇腾的嵌入式方案差异 一、自动驾驶的实时决策挑战与边缘计算需求 自动驾驶系统需在30ms内完成环境感知、路径规划与车辆控制的全流程闭环。传统云端计算受限于网络延迟…...
【Java面试系列】Spring Boot中自动配置原理与自定义Starter开发实践详解 - 3-5年Java开发必备知识
【Java面试系列】Spring Boot中自动配置原理与自定义Starter开发实践详解 - 3-5年Java开发必备知识 引言 Spring Boot作为Java生态中最流行的框架之一,其自动配置机制和Starter开发是面试中的高频考点。对于3-5年经验的Java开发者来说,深入理解这些原理…...
MySQL的子查询
一、前言 MySQL 子查询是指嵌套在其他 SQL 语句(如 SELECT、WHERE、FROM 等)内部的查询。用于辅助主查询完成复杂的数据筛选或计算。 二、子查询分类 标量子查询 描述:返回 单行单列(一个值),常用于比较运…...
SpringDoc【使用详解】
SpringDoc使用详解 一、何为SpringDoc二、概念解释三、SpringDoc使用2.1简单集成2.2 配置SpringDoc2.2.1 yml方式配置2.2.2配置文档信息 2.3配置文档分组2.4使用注解2.4.1 Tag2.4.2 Operation2.4.3 Schema2.4.4 NotNull2.4.5 Parameter2.4.6 Parameters2.4.7 ApiResponses 和Ap…...
Redis持久化 | RDB AOF | 常见问题
目录 RDB(Redis DataBase) 给什么内存数据做快照——(全量) 触发机制 RDB文件生成的时候会阻塞主线程吗? 关闭持久化命令 bgsave执行流程 RDB文件怎么配置?有哪些优缺点 优点: 缺点&am…...
判断矩阵A是否可以相似对角化
【例题1】 【例题2】...
React 列表渲染
开发环境:Reacttsantd 你可能经常需要通过 JavaScript 的数组方法 来操作数组中的数据,从而将一个数据集渲染成多个相似的组件。在这篇文章中,你将学会如何在 React 中使用 filter() 筛选需要渲染的组件和使用 map() 把数组转换成组件数组。 …...
C#核心学习(八)面向对象--封装(7)终章 C#内部类和分部类、密封类
目录 一、内部类(Inner Class) 1. 什么是内部类? 2. 内部类的作用 3. 如何定义内部类? 4. 常见应用场景 二、分部类(Partial Class) 1. 什么是分部类? 2. 分部类的写法 3.…...
[ctfshow web入门] web25
信息收集 要想拿到flag,需要突破两层if。 解题 第一个if 传入r0,拿到mt_rand的值,由于每一次访问都会重新设置种子,所以每一次访问都是一样的随机数。 所以我们的r mt_rand-显示的值 1799250188 r1799250188就可以突破第一…...
局域网访问 Redis 方法
局域网访问 Redis 方法 默认情况下,Redis 只允许本机 (127.0.0.1) 访问。如果你想让局域网中的其他设备访问 Redis,需要 修改 Redis 配置,并确保 防火墙放行端口。 方法 1:修改 Redis 配置 1. 修改 redis.conf(或 me…...
oracle 索引失效
在 Oracle 11g 中,索引失效的常见原因包括函数修改列、隐式类型转换、统计信息过时等,解决方法需结合版本特性(如虚拟列、索引跳跃扫描)。通过执行计划分析、统计信息维护和合理使用提示(Hints),…...
网络安全-等级保护(等保) 0. 前言
各位伙伴好: 招投标总结已过去一年了,时间飞逝,一直忙于工作,等保相关的内容断断续续整理了近半年的时间,但一直无暇完成博客内容。 等保已经是一个成熟的体系,现在已进入等保2.0时代,相关政策…...
【数据结构】树的介绍
目录 一、树1.1什么是树?1.2 树的概念与结构1.3树的相关术语1.4 树形结构实际运用场景 二、二叉树2.1 概念与结构2.2 特殊的二叉树2.2.1 满二叉树2.2.2 完全二叉树 个人主页,点击这里~ 数据结构专栏,点击这里~ 一、树 1.1什么是树࿱…...
大模型是如何把向量解码成文字输出的
hidden state 向量 当我们把一句话输入模型后,例如 “Hello world”: token IDs: [15496, 995]经过 Embedding Transformer 层后,会得到每个 token 的中间表示,形状为: hidden_states: (batch_size, seq_len, hidd…...
Android源码之App启动
目录 App启动概述 App启动过程 App启动过程图 源码概述 跨进程启动 进程内启动 下面以应用桌面Launcher启动App的MainActivity来举例: App启动概述 首先,MainActivity是由Launcher组件来启动的,而Launcher又是通过Activity管理服务Act…...
nginx如何实现负载均衡?
Nginx 是一款高性能的 Web 服务器和反向代理服务器,它可以通过配置实现负载均衡功能。以下是实现负载均衡的详细步骤和方法: 1. 基本概念 负载均衡是将客户端请求分发到多个后端服务器上,以提高系统的可用性和性能。Nginx 支持多种负载均衡策…...
【GESP】C++二级练习 luogu-B3721 [语言月赛202303] Stone Gambling S
GESP二级练习,多层循环分支练习,难度★✮☆☆☆。 题目题解详见:https://www.coderli.com/gesp-2-luogu-b3721/ 【GESP】C二级练习 luogu-B3721 [语言月赛202303] Stone Gambling S | OneCoderGESP二级练习,多层循环分支练习&am…...
2. Qt界面文件原理
本节主要介绍ui文件如何与窗口关联,并通过隐式连接方式显示对话框 本文部分ppt、视频截图原链接:[萌马工作室的个人空间-萌马工作室个人主页-哔哩哔哩视频] 1 UI文件如何与窗口关联 1.1 mainwindow.cpp的头文件ui_mainwindow.h 根据编译原理的基本规…...
Elastic 的 OpenTelemetry 分发版(EDOT)现已正式发布:开源、可用于生产环境的 OTel
作者:来自 Elastic Miguel Luna 及 Bahubali Shetti Elastic 自豪地宣布正式发布 Elastic OpenTelemetry 分发版(Elastic Distributions of OpenTelemetry - EDOT),其中包含 Elastic 自定义版本的 OpenTelemetry Collector 以及多…...
docker部署jenkins并成功自动化部署微服务
一、环境版本清单: docker 26.1.4JDK 17.0.28Mysql 8.0.27Redis 6.0.5nacos 2.5.1maven 3.8.8jenkins 2.492.2 二、服务架构:有gateway,archives,system这三个服务 三、部署步骤 四、安装linux 五、在linux上安装redis&#…...
UML对象图
UML对象图 一、对象图核心概念 对象图(Object Diagram)描述的是系统在某一时刻对象(实例)的状态快照。它关注的是实际对象之间的实例关系,而不是类与类之间的静态结构。主要特点有: 对象(Ob…...
【NLP 53、投机采样加速推理】
目录 一、投机采样 二、投机采样改进:美杜莎模型 流程 改进 三、Deepseek的投机采样 流程 Ⅰ、输入文本预处理 Ⅱ、引导模型预测 Ⅲ、候选集筛选(可选) Ⅳ、主模型验证 Ⅴ、生成输出与循环 骗你的,其实我在意透了 —— 25.4.4 一、…...
[250403] HuggingFace 新增检查模型与电脑兼容性的功能 | Firefox 发布137.0 支持标签组
目录 Hugging Face 让寻找兼容的 AI 模型变得更容易Firefox 137 版本更新摘要 Hugging Face 让寻找兼容的 AI 模型变得更容易 Hugging Face 是一个流行的在线平台,用于访问开源人工智能 (AI) 工具和模型。该平台推出了一项有用的新功能,允许个人轻松检查…...
VScode连接CentOS 7.6虚拟机
本文内容:在Windows上使用VMware运行虚拟机,然后使用VScode连接CentOS 7.6虚拟机。 进入系统前 安装VMware 安装教程参考:VMware安装 下载CentOS 7.6镜像 可以使用国内镜像源,但是一般国内镜像源要么已经不维护CentOS 7.6这个…...









