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引导程序)以兼顾两者优势:

  1. EXE负责运行时检测(如.NET Framework依赖)

  2. 调用MSI执行实际安装

  3. 提供友好的用户界面和错误处理

通过理解这些差异,您可以根据项目需求(如部署规模、维护复杂度、用户体验)选择最合适的安装包格式。

示例代码:

复制代码
# 示例:静默安装封装后的EXE
Setup.exe /S /v"/qn INSTALLDIR=\"C:\Program Files\""

三,测试

准备一个Windows11测试环境,并将两个安装文件导入至测试 环境中。

1,安装

2,运行

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

成功。

3,删除

成功。

最后附上本项目gitee仓库

root/会员管理系统

相关推荐
珊瑚里的鱼7 小时前
第五讲(下)| string类的模拟实现
开发语言·c++·笔记·程序人生·算法·visualstudio·visual studio
追逐时光者8 小时前
由 MCP 官方推出的 C# SDK,使 .NET 应用程序、服务和库能够快速实现与 MCP 客户端和服务器交互!
后端·.net·mcp
淘源码d9 小时前
如何运用C#.NET快速开发一套掌上医院系统?
开发语言·c#·.net·源码·掌上医院
一个程序员(●—●)9 小时前
xLua环境控制+xLua的Lua调用C#的1
开发语言·unity·c#·lua
qq_3404740210 小时前
6.1 python加载win32或者C#的dll的方法
java·python·c#
Trustport11 小时前
C# EventLog获取Windows日志进行查询设置多个EventLogQuery查询条件
开发语言·c#
勘察加熊人11 小时前
c#的form实现飞机大战
开发语言·c#
电星托马斯12 小时前
Linux如何设置bash为默认shell
linux·运维·服务器·笔记·程序人生·bash·个人开发
观无12 小时前
JWT认证服务
前端·c#·vue
FAREWELL0007513 小时前
C#核心学习(八)面向对象--封装(7)终章 C#内部类和分部类
开发语言·学习·c#·内部类·密封类·分部类