C#制作打包安装程序,安装程序类使用

news2024/9/24 9:22:22

这里写目录标题

    • 安装Microsoft Visual Studio Installer Projects
    • 创建安装项目
    • 设置安装程序文件
    • 设置程序桌面图标
    • 给程序设置安装程序名称
    • 安装程序类怎么使用
    • Installer1.cs
    • 自定义安装步骤
    • 自定义设置安装程序路径,让用户安装时不能选择安装路径
    • 生成安装包

安装Microsoft Visual Studio Installer Projects

解决方案选中,visual studio界面顶部菜单栏,扩展—>管理扩展—>联机,在右侧搜索栏输入setup,搜索项目,安装Microsoft Visual Studio Installer Projects 2022,
在这里插入图片描述

创建安装项目

然后在解决方案上右键,新建项目,搜索setup,选中Setup Project下一步创建此项目;
在这里插入图片描述
在安装项目上右键,选择View–>文件系统—>Application Folder,去要发布的程序复制他的Release版本文件到此栏粘贴即可,
在这里插入图片描述

设置安装程序文件

在这里插入图片描述

设置程序桌面图标

选中User’s Desktop,然后点击右键—>创建新的快捷方式,然后选择Application Folder里面的exe,点击ok,
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

给程序设置安装程序名称

此名称显示在控制面板–程序和功能–中的名称。选择安装项目,然后按F4,弹出属性窗口

  • ProductName:设置程序安装名称,
  • Author:设置程序发布人,一般是公司名称
  • TargetPlatform : 指定软件目标平台 x86 or x64
  • Version :发布版本号

在这里插入图片描述

安装程序类怎么使用

在解决方案上右键,创建一个控制台应用程序ProjectStepOperate,项目名称自定义,然后控制台应用程序项目,右键,新建项,选择安装程序类Installer1.cs
在这里插入图片描述
在这里插入图片描述

Installer1.cs

在安装程序类中,可以在OnAfterInstall方法中,写注册表创建项,

using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration.Install;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Whl.Tool;

namespace ProjectStepOperate
{
    /// <summary>
    /// 安装控制
    /// </summary>
    /// 创建时间:2023-7-7 16:56:50, 
    [RunInstaller(true)]
    public partial class Installer1 : System.Configuration.Install.Installer
    {
        public Installer1()
        {
            InitializeComponent();
        }

        protected override void OnBeforeInstall(IDictionary savedState)
        {
            //File.WriteAllText("c://Installer1.txt", "安装前执行," + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
            RegeditWrite.AddLog("安装前执行OnBeforeInstall");

            string dir = "c://zyt_bluetooth_service";
            if (!System.IO.Directory.Exists(dir))
            {
                Directory.CreateDirectory(dir);
                RegeditWrite.AddLog(dir + "安装目录创建成功");
            }

            //base.OnBeforeInstall(savedState);
        }

        protected override void OnAfterInstall(IDictionary savedState)
        {
            //File.WriteAllText("c://Installer2.txt", "安装之后执行," + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
            RegeditWrite.AddLog("安装之后执行OnAfterInstall");

            //写入注册表
            RegeditWrite.WriteExeRunAgreement();

        }


    }
}

自定义安装步骤

在用户界面,可以吧“安装文件夹”删除,然后就可以让用户不能选择安装的目录,
在这里插入图片描述

自定义设置安装程序路径,让用户安装时不能选择安装路径

在Application Folder右键属性,修改DefaultLocation的值,比如改为C:\zyt_bluetooth_service,
则程序将安装在此路径,可以再用户界面中 Install—>Start—>,删除安装文件夹,删除安装文件夹后,用户安装界面将不再让其选择安装目录,程序将自动安装到设置的C:\zyt_bluetooth_service
在这里插入图片描述

生成安装包

在安装项目右键,点击“重新生成”,将在项目文件夹中自动生成安装包,文件xxxx.msi可以双击安装。
在这里插入图片描述

参考文章
https://zhuanlan.zhihu.com/p/622419157?utm_id=0
https://blog.csdn.net/qq_39727831/article/details/124421534

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实例011 在状态栏中显示检查框

实例说明 在设计程序界面时&#xff0c;为了规范界面&#xff0c;可以将一些控件放置在状态栏中&#xff0c;这样既能起到控制程序的作用&#xff0c;又能使界面和谐、美观。运行程序&#xff0c;在窗体的状态栏中加入了显示时间检查框。效果如图1.11所示。 技术要点 在状态…

对Linux系统对Spark开发环境配置

单机版本 上传对应文件&#xff0c;解压文件&#xff0c;并查看 unzip scala-2.12.12.zip tar -xzf spark-3.2.0-bin-hadoop2.7.tgz 移动scala及spark安装包到指定目录下 在opt目录下移动该文件到/usr目录下 mv scala-2.12.12 /usr/scala/ mv spark-3.2.0-bin-hadoop2.7 /…

Django_使用redis缓存数据

目录 一、配置redis 二、缓存Django的默认session 三、使用django的缓存机制缓存数据 四、自定义缓存数据 源码等资料获取方法 一、配置redis 在settings中添加配置参数 # Django的缓存配置 CACHES {"default": {"BACKEND": "django_redis.ca…

【企业微信多选的星期数据生成如“周一、周三至周六“】

目标效果如下图 实现这个过程首先是要找到逻辑&#xff0c;这个看似简单的操作却属实让我想了很久。 首先要了解需求 根据拿到的数据得到生成符合要求的字符串。中间有连续的星期大于三天的&#xff0c;开始和结束星期中间要有"至"。 分析逻辑 一、判断开始日期和…

RabbitMQ系列(19)--实现在RabbitMQ宕机的情况下对消息进行处理

前言&#xff1a;在生产环境中由于一些不明原因&#xff0c;导致RabbitMQ重启的情况下&#xff0c;在RabbitMQ重启期间生产者投递消息失败&#xff0c;生产者发送的消息会丢失&#xff0c;那这时候就需要去想在极端的情况下&#xff0c;RabbitMQ集群不可用的时候&#xff0c;如…

创造一款安卓自定义控件_裁剪原理介绍

1、新增功能&#xff0c;旋转&#xff1a; 效果如图&#xff0c;点击旋转&#xff0c;可以将控件画面本身进行90度倍数的旋转&#xff0c;并进行宽高比例适配&#xff0c;旋转之后裁剪依然正常。 功能实现原理&#xff1a; 1、通过调用view的setRotation功能进行以View为中心…

Stable Diffusion - 超分辨率插件 StableSR v2 (768x768) 配置与使用

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/131582734 论文&#xff1a;Exploiting Diffusion Prior for Real-World Image Super-Resolution StableSR 算法提出了一种新颖的方法&#xff0…

【JAVA】JAVA与C++的区别与联系

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️初识JAVA】 文章目录 前言两方介绍CJAVA 不同|Java不支持指针、模板、指针重载、联合等||支持析构函数||条件编译和包含||螺纹支架||默认参数||转到语句||多重继承||异常处理||方法重载和操作符重载|…

对表中的数据操作

目录标题 创建一个工作者的表 &#xff0c;对表中数据进行相关操作worker表要求表中的数据内容 对数据的操作1.显示所有职工的基本信息2.查询所有职工所属部门的部门号&#xff0c;不显示重复的部门号3.求出所有职工的人数4.列出最高工和最低工资5.列出职工的平均工资和总工资6…

卷积神经网络CNN进阶与搭建

目录 Pooling&#xff08;池化&#xff09;ReluResNetGradient VanishingFeature scalingImage NormalizationBatch Normalization Pooling&#xff08;池化&#xff09; 在降采样(Subsampling)中起作用&#xff0c;在不改变feature map的基础上&#xff0c;在卷积出来的基础上…

【LeetCode】217. 存在重复元素

217. 存在重复元素&#xff08;简单&#xff09; 方法一&#xff1a;哈希表长度比较 思路 针对重复元素&#xff0c;很容易就想到 set。我们可以先将 nums 中的所有元素存入set&#xff0c;然后比较两个数据结构的长度&#xff0c;如果相等则说明不存在重复元素&#xff0c;反…

Android View滑动处理大法

原文链接 Android View滑动处理大法 对于触控式操作来说&#xff0c;滑动是一个特别重要的手势操作&#xff0c;如何做到让应用程序的页面滑动起来如丝般顺滑&#xff0c;让用户感觉到手起刀落的流畅感&#xff0c;是开发人猿需要重点解决的问题&#xff0c;这对提升用户体验是…

Python:使用 np.lib.stride_tricks.sliding_window_view 将立方体切割成N个三维小块

函数说明&#xff1a;np.lib.stride_tricks.sliding_window_view(arr, window_shape) 参数说明&#xff1a; arr&#xff1a;要创建滑动窗口视图的数组。 window_shape&#xff1a;滑动窗口的形状&#xff0c;表示切割出的小块的大小。 作用&#xff1a;用于创建滑动窗口视图。…

软件设计模式与体系结构-软件体系-基于事件的软件体系结构

目录 三、基于事件的软件体系结构代码显式调用隐式调用事件系统软件体系结构的概念事件系统的连接机制 例子&#xff1a;图形用户界面事件系统调度策略1.带有分离的派遣模块的事件管理器 观察者模式类图观察者模式应用实例 课程作业 三、基于事件的软件体系结构 计算机中&…

Prototype Completion for Few-Shot Learning

小样本学习的目的是用很少的例子来识别新类。基于预训练的方法有效地解决了通过预训练一个特征提取器&#xff0c;然后通过最近的基于质心的元学习对其进行微调 (pretraining fine-tuning)。然而,结果表明微调步骤使边际改进。在本文中&#xff0c;1)我们找出原因&#xff0c;…

Kafka入门,漏消费和重复消费, 消费者事务,数据积压(二十四)

漏消费和重复消费 重复消费&#xff1a;已经消费了数据&#xff0c;但是offset没提交。 漏消费&#xff1a;先提交offset后消费&#xff0c;有可能会造成数据得漏消费 消费者事务 如果向完成consumer端得进准一次性消费&#xff0c;那么需要Kafka消费端将消费过程和提交offs…

Gradio库中的State模块:保存用户会话状态的神秘组件

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

Python Flask构建微信小程序订餐系统 (六)

🔥 账号管理 🔥 展示账户列表 默认情况下的账户列表布局 查询用户信息 查询 所有用户信息 按照 倒序 的方式查询出来 User.query.order_by( User.uid.desc() ).all() ......@route_account.route("/index") def index():#模版文件夹取名叫 "account/login…

【netty】Netty模型

工作原理 1&#xff09;Netty抽象出两组线程池 BossGroup 专门负责接收客户端的连接, WorkerGroup 专门负责网络的读写&#xff1b; 2&#xff09;BossGroup 和 WorkerGroup 类型都是 NioEventLoopGroup 3&#xff09;NioEventLoopGroup 相当于一个事件循环组, 这个组中含有多…

RabbitMQ系列(17)--延迟队列的简介与实现

1、延迟队列的概念 延迟队列内部是有序的&#xff0c;重要的特性体现在它的延迟属性上&#xff0c;延迟队列中的元素希望在指定时间到了之后或之前取出处理&#xff0c;简单的说延迟队列就是用来存放需要在指定时间被处理的元素的队列。 2、延迟队列的应用场景 (1)订单指定时…