Inno Setup打包winform、wpf程序可判断VC++和.net环境

Inno Setup打包winform、wpf程序可判断VC++和.net环境

  • 1、下载Inno Setup
  • 2、新建打包文件、开始打包
      • 1、新建打包文件
      • 2、填写 应用名称、版本号、公司名称、公司官网
      • 3、选择安装路径 Custom是指定默认路径、Program Files folder是默认C盘根目录
      • 4、选择程序启动exe文件 以及Addfolder选择全部运行文件
      • 5、选择安装前显示文字 、安装中、安装后
      • 6、安装模式
      • 7、选择安装语言
      • 8、输出信息
  • 3、需要判断安装时的环境

1、下载Inno Setup

官网链接: link

2、新建打包文件、开始打包

1、新建打包文件

新建文件

2、填写 应用名称、版本号、公司名称、公司官网

在这里插入图片描述

3、选择安装路径 Custom是指定默认路径、Program Files folder是默认C盘根目录

在这里插入图片描述

4、选择程序启动exe文件 以及Addfolder选择全部运行文件

在这里插入图片描述
在这里插入图片描述

5、选择安装前显示文字 、安装中、安装后

这里我只选择了安装前显示条款
在这里插入图片描述

6、安装模式

管理员安装(所有用户均可安装)
仅限当前用户安装
命令覆盖安装
启动时选择安装模式
这里我默认管理员
在这里插入图片描述

7、选择安装语言

这里我选择的简体中文、默认没有的需要自己去网上找语言包
在这里插入图片描述

8、输出信息

输出文件位置
打包文件名称
打包后的文件图标
打包文件密码
在这里插入图片描述

至此不需要判断环境的设置完成、一路点击next就行

3、需要判断安装时的环境

在【Files】添加如下代码
在这里插入图片描述
注意这个路径是你自己离线环境的位置 最好放置到打包文件中 D:\Desktop\打包\DELIN_SVIEW\OutPut\VC_redist.x64.exe

Source: "D:\Desktop\打包\DELIN_SVIEW\OutPut\VC_redist.x64.exe";DestDir:"{tmp}";DestName:"vcredistx64.exe";Flags:ignoreversion
Source: "D:\Desktop\打包\DELIN_SVIEW\OutPut\ndp472-kb4054530-x86-x64-allos-enu.exe";DestDir:"{tmp}";DestName:"dotnet472.exe";Flags:ignoreversion

在【Code】添加如下代码

[Code]//vc++ 安装环境检查 plat:x64 x86
function IsVCPPDetected(version:string;plat:string): Boolean;
var success: Boolean;key,versionkey:string;build,versionBuild:cardinal;
beginversionkey:=version;versionBuild:=0;case version of        '13':beginversionkey:='12.0';versionBuild:=40660;end;'15':beginversionkey:='14.0';versionBuild:=23026;end;'19':beginversionkey:='14.0';versionBuild:=28720;end;end;key:='SOFTWARE\Wow6432Node\Microsoft\VisualStudio\'+versionkey+'\VC\Runtimes\'+plat;success:=RegQueryDWordValue(HKLM, key, 'Bld', build);success:=success and (build>=versionBuild);result := success;
end;//.net framework安装检查 —— 判断指定的.NET Framework版本及service pack是否已经安装
// 函数参数说明:
// 参数1:version -- 指定待判断的.NET Framework版本【下面列举了对应关系】:
//    'v1.1'          .NET Framework 1.1
//    'v2.0'          .NET Framework 2.0
//    'v3.0'          .NET Framework 3.0
//    'v3.5'          .NET Framework 3.5
//    'v4\Client'     .NET Framework 4.0 Client Profile
//    'v4\Full'       .NET Framework 4.0 Full Installation
//    'v4.5'          .NET Framework 4.5
//    'v4.5.1'        .NET Framework 4.5.1
//    'v4.5.2'        .NET Framework 4.5.2
//    'v4.6'          .NET Framework 4.6
//    'v4.6.1'        .NET Framework 4.6.1
//    'v4.6.2'        .NET Framework 4.6.2
//    'v4.7'          .NET Framework 4.7
//    'v4.7.1'        .NET Framework 4.7.1
//    'v4.7.2'        .NET Framework 4.7.2
//    `v4.8`          .NET Framework 4.8
//
// 参数2:service -- 指定待判断的service pack版本:
//    0               No service packs required
//    1, 2, etc.      Service pack 1, 2, etc. required
function IsDotNetDetected(version: string; service: cardinal): boolean;
varkey, versionKey: string;install, release, serviceCount, versionRelease: cardinal;success: boolean;
beginversionKey := version;versionRelease := 0;// .NET 1.1 and 2.0 embed release number in version keyif version = 'v1.1' then beginversionKey := 'v1.1.4322';end else if version = 'v2.0' then beginversionKey := 'v2.0.50727';end// .NET 4.5 and newer install as update to .NET 4.0 Fullelse if Pos('v4.', version) = 1 then beginversionKey := 'v4\Full';case version of'v4.5':   versionRelease := 378389;'v4.5.1': versionRelease := 378675; // 378758 on Windows 8 and older'v4.5.2': versionRelease := 379893;'v4.6':   versionRelease := 393295; // 393297 on Windows 8.1 and older'v4.6.1': versionRelease := 394254; // 394271 before Win10 November Update'v4.6.2': versionRelease := 394802; // 394806 before Win10 Anniversary Update'v4.7':   versionRelease := 460798; // 460805 before Win10 Creators Update'v4.7.1': versionRelease := 461308; // 461310 before Win10 Fall Creators Update'v4.7.2': versionRelease := 461808; // 461814 before Win10 April 2018 Update'v4.8': versionRelease := 528040;end;end;// installation key group for all .NET versionskey := 'SOFTWARE\Microsoft\NET Framework Setup\NDP\' + versionKey;// .NET 3.0 uses value InstallSuccess in subkey Setupif Pos('v3.0', version) = 1 then beginsuccess := RegQueryDWordValue(HKLM, key + '\Setup', 'InstallSuccess', install);end else beginsuccess := RegQueryDWordValue(HKLM, key, 'Install', install);end;// .NET 4.0 and newer use value Servicing instead of SPif Pos('v4', version) = 1 then beginsuccess := success and RegQueryDWordValue(HKLM, key, 'Servicing', serviceCount);end else beginsuccess := success and RegQueryDWordValue(HKLM, key, 'SP', serviceCount);end;// .NET 4.5 and newer use additional value Releaseif versionRelease > 0 then beginsuccess := success and RegQueryDWordValue(HKLM, key, 'Release', release);success := success and (release >= versionRelease);end;result := success and (install = 1) and (serviceCount >= service);
end;//安装包初始化                      
function CheckDotNet(): Boolean;
var Path:string ; ResultCode: Integer; Success:Boolean;
beginSuccess:=true;if not IsDotNetDetected('v4.7.2', 0) then beginMsgBox('软件运行需要 Microsoft .NET Framework 4.7.2, 即将开始安装.NET Framework。', mbInformation, MB_OK);ExtractTemporaryFile('dotnet472.exe');Path:=ExpandConstant('{tmp}\dotnet472.exe')Exec(Path, '', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode);if not IsDotNetDetected('v4.7.2', 0) thenbeginif  MsgBox('.Net Framework4.7.2组件安装失败,无法运行程序,是否继续安装!',mbInformation,MB_YESNO) = IDYES thenbeginSuccess:=trueend else beginSuccess := false;result:=Success;Exit;end;endelseSuccess := true;endelseSuccess := true;result := Success;         
end;//安装包初始化                      
function CheckVC(): Boolean;
var Path:string ; ResultCode: Integer; Success:Boolean;
beginSuccess:=true;if not IsVCPPDetected('19','x64') thenbeginMsgBox('软件运行需要 Microsoft Visual C++ 2019 Redistributable x64, 即将开始安装vc redist x64', mbInformation, MB_OK);ExtractTemporaryFile('vcredistx64.exe');Path:=ExpandConstant('{tmp}\vcredistx64.exe')Exec(Path, '', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode);if not IsVCPPDetected('19','x64') thenbeginif MsgBox('Microsoft Visual C++ 2019 Redistributable x64组件安装失败,部分功能无法使用,是否继续安装!',mbInformation,MB_YesNo) = IDYES thenbeginSuccess:=true;end else begin Success := false;result:=Success;Exit;end;endelse begin end;end;result := Success;         
end;function InitializeSetup: Boolean;
beginResult := CheckDotNet();Result := CheckVC();
end;

最后点击运行即可
在这里插入图片描述

在这里插入图片描述
跑完就会生成.exe文件在你 第八步 指定的输出目录下

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

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

相关文章

【Python】基于Python和Qt的海康威视相机开发

文章目录 0 前期教程1 前言2 例程解析3 图像获取4 其他问题与解决办法5 使用到的python包 0 前期教程 【项目实践】海康威视工业相机SDK开发小白版入门教程(VS2015OpenCV4.5.1) 1 前言 此前写了一篇基于C开发海康威视相机的博客,貌似看的人…

springboot实现qq邮箱发送邮件或者验证码

首先我先去qq邮箱或者网易邮箱开通POP3/IMAP/SMTP/Exchange/CardDAV 服务 它在左上角的设置——账户——往下滑就可以找到——然后点击开通 开通后就会得到一串授权码。如下图 接下来直接编写代码 首先我没导入依赖 <!-- 这个是邮箱验证--> <dependency> <group…

Python 模块 ddt 数据驱动测试

简介 ddt 提供了一种方便的方法来实现数据驱动测试&#xff08;Data-Driven Testing&#xff09;。数据驱动测试是一种测试方法&#xff0c;通过将测试数据与测试逻辑分开&#xff0c;可以使用不同的数据集来运行相同的测试用例。这样可以提高测试的灵活性和可维护性&#xff0…

【Deviation】50 Matplotlib Visualizations, Python实现,源码可复现

详情请参考博客: Top 50 matplotlib Visualizations 因编译更新问题&#xff0c;本文将稍作更改&#xff0c;以便能够顺利运行。 本文介绍一下5中图示&#xff1a; Diverging Bars Diverging Texts Diverging Dot Plot Diverging Lollipop Chart with Markers Area Chart 1 Di…

【C++】通过栈和队列学会使用适配器和优先队列学会仿函数的使用

&#x1f307;个人主页&#xff1a;平凡的小苏 &#x1f4da;学习格言&#xff1a;命运给你一个低的起点&#xff0c;是想看你精彩的翻盘&#xff0c;而不是让你自甘堕落&#xff0c;脚下的路虽然难走&#xff0c;但我还能走&#xff0c;比起向阳而生&#xff0c;我更想尝试逆风…

pytorch安装GPU版本 (Cuda12.1)教程: Windows、Mac和Linux系统下GPU版PyTorch(CUDA 12.1)快速安装

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

vscode设置java -Xmx最大堆内存

如果在vscode中直接运行java程序&#xff0c;想要改下每次运行的最大堆内存&#xff0c;按照如下修改 一、vscode安装java插件 当然前提是vscode在应用管理中已经安装了java语言的插件&#xff0c;Debugger for Java,如下图所示 二、CommandShiftP打开配置搜索框 三、搜索…

dpdpdp

这里写目录标题 139. 单词拆分322. 零钱兑换300. 最长递增子序列120. 三角形最小路径和64. 最小路径和63. 不同路径 II5. 最长回文子串&#xff08;回文dp&#xff09;⭐97. 交错字符串⭐&#xff08;抽象成路径问题&#xff09;221. 最大正方形⭐ 139. 单词拆分 class Soluti…

代码随想录day8 | KMP 28.实现strStr() 459.重复的子字符串

文章目录 一、实现strStr()二、重复的子字符串 一、实现strStr() 先学学KMP算法&#xff0c;代码随想录 28.实现strStr() class Solution { public:void getNext(int* next, const string& s) {int j -1;next[0] j;for(int i 1; i < s.size(); i) { // 注意i从1开始…

微信小程序的微信一键登录与验证码登录

验证码登录 <template><view class"wx-login"><view class"login-Box"><text class"title">欢迎登录</text><text class"subTitle">再就业男团系统</text><view class"login-Form…

【算法基础:搜索与图论】3.3 拓扑排序

文章目录 拓扑排序介绍如何构造拓扑排序&#xff08;⭐重要&#xff01;&#xff09; 例题&#xff1a;848. 有向图的拓扑序列BFS 写法构造拓扑排序 相关题目练习207. 课程表&#xff08;判断是否存在拓扑序列&#xff09;bfs 写法dfs 写法 210. 课程表 II&#xff08;找到一个…

算法竞赛入门【码蹄集新手村600题】(MT1020-1040)

算法竞赛入门【码蹄集新手村600题】(MT1020-1040&#xff09; 目录MT1021 %f格式符MT1022 小数、指数MT1023 进制乱炖MT1024 进制形式MT1025 八、十六进制MT1026 合并MT1027 整数逆序MT1028 四位数逆序MT1029 位数MT1030 最大公约数MT1031 最简分数MT1032 最小公倍数MT1033 多项…

Docker 续

Docker 续 一、Docker 网络1.1 Docker 网络实现原理1.2 Docker 的网络模式1.2.1 Docker 网络模式分类 1.3 如何创建各类网络模式1.4 host模式1.5 container模式1.6 none模式1.7 bridge模式1.8 自定义网络 二、资源控制2.1 Cgroup2.2 CPU 资源控制2.2.1 设置CPU使用率上限2.2.2 …

c# Outlook检索设定问题

基于c# 设定outlook约会予定&#xff0c;时间格式是YYYY-MM-DD HH:mm 的情报。 问题发生&#xff1a; 根据开始时间&#xff08;2023/01/01 7:00&#xff09;条件查询该时间是否存在outlook信息时&#xff0c;明明存在一条数据&#xff0c;就是查询不出来数据 c#代码 Strin…

Observability:Synthetic monitoring - 动手实践

在我之前的如下文章里&#xff1a; Observability&#xff1a;Synthetic monitoring - 合成监测入门&#xff08;一&#xff09;&#xff08;二&#xff09; Observability&#xff1a;Synthetic monitoring - 创建浏览器监测&#xff0c;配置单独的浏览器监测器及项目 我详…

数据预处理matlab

matlab数据的获取、预处理、统计、可视化、降维 数据的预处理 - MATLAB & Simulink - MathWorks 中国https://ww2.mathworks.cn/help/matlab/preprocessing-data.html 一、数据的获取 1.1 从Excel中获取 使用readtable() 例1&#xff1a; 使用spreadsheetImportOption…

Vue整体架构分解

Vue.js的整体架构可以分解为以下几个部分: 文章目录 1. 数据驱动2. 组件化3. 响应式系统4. 虚拟DOM5. 插件系统6. 单文件组件7. 模板编译总结 1. 数据驱动 Vue的一个核心特点是数据驱动。Vue会在初始化的时候给数据提供一个observe监听&#xff0c;当数据变化时&#xff0c;会…

uniapp 微信小程序 input详解 带小数点的input、可查看密码的输入框input

官网文档地址 1、template <!-- 本示例未包含完整css&#xff0c;获取外链css请参考上文&#xff0c;在hello uni-app项目中查看 --> <template><view><view class"uni-common-mt"><view class"uni-form-item uni-column"&g…

【C++】开源:跨平台轻量日志库easyloggingpp

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍跨平台轻量日志库easyloggingpp。 无专精则不能成&#xff0c;无涉猎则不能通。。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&am…

详细介绍Matlab中线性规划算法的使用

Matlab中提供了用于线性规划的优化工具箱&#xff0c;其中包含了多种算法&#xff0c;如单纯形法、内点法等。线性规划是一种优化问题&#xff0c;旨在找到一组变量的最佳值&#xff0c;以最大化或最小化线性目标函数&#xff0c;同时满足一组线性约束条件。 下面将详细介绍Ma…