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

news2024/11/29 8:49:52

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;
begin
    versionkey:=version;
    versionBuild:=0;

    case version of        
        '13':
            begin
            versionkey:='12.0';
            versionBuild:=40660;
            end;

        '15':
            begin
            versionkey:='14.0';
            versionBuild:=23026;
            end;
        '19':
            begin
            versionkey:='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;
var
    key, versionKey: string;
    install, release, serviceCount, versionRelease: cardinal;
    success: boolean;
begin
    versionKey := version;
    versionRelease := 0;

    // .NET 1.1 and 2.0 embed release number in version key
    if version = 'v1.1' then begin
        versionKey := 'v1.1.4322';
    end else if version = 'v2.0' then begin
        versionKey := 'v2.0.50727';
    end

    // .NET 4.5 and newer install as update to .NET 4.0 Full
    else if Pos('v4.', version) = 1 then begin
        versionKey := '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 versions
    key := 'SOFTWARE\Microsoft\NET Framework Setup\NDP\' + versionKey;

    // .NET 3.0 uses value InstallSuccess in subkey Setup
    if Pos('v3.0', version) = 1 then begin
        success := RegQueryDWordValue(HKLM, key + '\Setup', 'InstallSuccess', install);
    end else begin
        success := RegQueryDWordValue(HKLM, key, 'Install', install);
    end;

    // .NET 4.0 and newer use value Servicing instead of SP
    if Pos('v4', version) = 1 then begin
        success := success and RegQueryDWordValue(HKLM, key, 'Servicing', serviceCount);
    end else begin
        success := success and RegQueryDWordValue(HKLM, key, 'SP', serviceCount);
    end;

    // .NET 4.5 and newer use additional value Release
    if versionRelease > 0 then begin
        success := 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;
begin
    Success:=true;

    if not IsDotNetDetected('v4.7.2', 0) then 
    begin
        MsgBox('软件运行需要 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) then
        begin
            if  MsgBox('.Net Framework4.7.2组件安装失败,无法运行程序,是否继续安装!',mbInformation,MB_YESNO) = IDYES then
            begin
                Success:=true
            end else 
            begin
                Success := false;
                result:=Success;
                Exit;
            end;
        end
        else
            Success := true;
    end
    else
        Success := true;

    result := Success;         
end;



//安装包初始化                      
function CheckVC(): Boolean;
var Path:string ; 
    ResultCode: Integer; 
    Success:Boolean;
begin
    Success:=true;

    if not IsVCPPDetected('19','x64') then
    begin
        MsgBox('软件运行需要 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') then
        begin
            if MsgBox('Microsoft Visual C++ 2019 Redistributable x64组件安装失败,部分功能无法使用,是否继续安装!',mbInformation,MB_YesNo) = IDYES then
            begin
                Success:=true;
            end else begin 
                Success := false;
                result:=Success;
                Exit;
            end;
        end
        else begin end;
    end;

    result := Success;         
end;

function InitializeSetup: Boolean;
begin
  Result := CheckDotNet();
  Result := CheckVC();
end;

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

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

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

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

相关文章

stable diffusion webui mov2mov

手把手教你用stable diffusion绘画ai插件mov2mov生成动画_哔哩哔哩_bilibili手把手教你用stable diffusion绘画ai插件mov2mov生成动画, 视频播放量 14552、弹幕量 3、点赞数 275、投硬币枚数 114、收藏人数 980、转发人数 75, 视频作者 懂你的冷兮, 作者简介 科技改变世界&…

I2S 总线接口

I2S(Inter-IC Sound)总线有时候也写作IIS,I2S是飞利浦公司提出的一种用于数字音频设备之间进行音频数据传输的总线。和I2C、SPI这些常见的通信协议一样,I2S总线用于主控制器和音频CODEC芯片之间传输音频数据。因此,要想使用I2S协议&#xff0…

C#基础--进程和线程的认识

C#基础–进程和线程的认识 一、基础概念 1. 什么是进程? 进程并不是物理的东西,是虚拟出来的,是一种概念。当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源。而一个进程又是由多个线程所组成的。是一种计算机概念,是程序在运…

CSDN新的改变2023.7.19

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

[Java]Set、Map、List常见实现类的特点、使用方法总结

文章目录 1、图谱2、List1、ArrayList1. 特点2. 常见方法 2、LinkedList1、特点2、常见方法 3、Vector1、特点 3、Map1、HashMap1、特点常用方法 2、TreeMap1、特点 3、LinkedHashMap1、特点 4、Set1、HashSet1 、特点2、常用方法 2、LinkedHashSet特点 3、TreeSet1、特点2、使…

智能照明控制系统在体育场馆项目中的应用

摘要:在智能化时代,运用智能技术设计照明已经成为社会发展的关键组成。文章简单介绍了智能体育场馆的含义,然后围绕智能照明系统的基本要求,从灯具选型、灯具配光的光线选择与瞄准、灯具眩光与外溢光控制;基本控制方式…

python编程语言之流程控制

代码块 以冒号作为开始,用缩进来划分作用域,代表一个整体,是一个代码块。所谓的作用域,就是程序运行过程中变量的可调用范围。 一个文件(模块)也可以称为一个代码块。 print(11) print(22) print(33)if True:print(1)print(2)p…

001-Spring简要原理分析-草稿

Bean查找流程 根据类型找找到多个根据名称找 Map<被代理类&#xff0c; List<方法>> 事务 Config 方法代理

使用mybatis-plus分页查询数据

这里使用springboot整合mybatis-plus&#xff0c;需要有springboot的基础才用的顺畅&#xff0c;下面直接开始&#xff0c; 首先导入mybatis-plus依赖&#xff0c; <!-- 使用mybatis-plus--> <dependency> <groupId>com.baomidou</groupId> <artifa…

基于.net6的WPF程序使用SignalR进行通信

之前写的SignalR通信&#xff0c;是基于.net6api&#xff0c;BS和CS进行通信的。 .net6API使用SignalRvue3聊天WPF聊天_signalr wpf_故里2130的博客-CSDN博客 今天写一篇关于CS客户端的SignalR通信&#xff0c;后台服务使用.net6api 。其实和之前写的差不多&#xff0c;主要在…

怎样查看Oracle的sid和service_name

用sysdba身份登录 比如 conn / as sysdba 匿名管理员登陆执行 select name form V$database; 或是执行select * from V$database;不过执行第二个显示的内容太多了不好找自己想要的结果你也可以先用desc V$database;语句查看一下V$database都有什么字段然后选择自己想要的字段…

【每天40分钟,我们一起用50天刷完 (剑指Offer)】第二十九天 29/50【数据流中的中位数( 大根堆 + 小根堆 )】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

百度卫星地图切换个性化地图

1.切换 if (mapType.value 1) {mapInstance.setMapType(BMAP_SATELLITE_MAP);//卫星地图} else if (mapType.value 2) {mapInstance.setMapType(BMAP_NORMAL_MAP);//标准地图mapInstance.setMapStyleV2({ styleJson: darkJson });//个性化样式}2.不带路况的卫星地图 mapIn…

Haystack:建立端到端的NLP应用程序的工具箱

Haystack是一个端到端的自然语言处理&#xff08;NLP&#xff09;框架&#xff0c;可以使用语言模型、Transformer模型、向量搜索等功能来构建NLP应用程序。无论您想进行问题回答、答案生成、语义文档搜索&#xff0c;还是构建能够进行复杂决策和查询解决的工具&#xff0c;都可…

php伪协议(文件包含-强行读取文件)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 php伪协议 伪协议详情 php伪协议 文件包含直接读取的是文件&#xff0c;而不是文件源码&#xff0c;所以要想办法读取源码方法。 那么就要涉及到 PHP 伪协议 ph…

Vulkan 同步

前言 在前面的文章中&#xff0c;我们讲解了Vulkan的多线程设计理念&#xff0c;分析了其底层的机制。我们知道在Vulkan的设计中&#xff0c;尽量避免资源的同步竞争&#xff0c;但是在某些复杂场景和多线程优化过程中难免会遇到资源竞争的问题&#xff0c;这时候就需要同步机…

Redis实战案例19-Redis解决主从一致性问题

主节点&#xff08;Master&#xff09;“写操作”&#xff1a; 接收并响应客户端的读写请求。持久化数据到磁盘&#xff08;根据配置可以选择使用RDB快照或者AOF日志&#xff09;。将自己的写操作同步给所有的从节点。处理发布/订阅&#xff08;Pub/Sub&#xff09;模式中的发…

shell脚本备份数据库

首先是在本地windows环境下尝试备份数据库 打开mysql的bin目录&#xff0c;然后在地址栏cmd&#xff0c;进入cmd界面&#xff0c;输入mysqldump命令&#xff0c;-u输入用户名&#xff0c;-p输入密码 还有数据库名称&#xff0c;以及后面要保存到的位置 mysqldump -uroot -p tes…

数据标准化助力生产企业产能提升

毫无疑问&#xff0c;多产线、多工厂的协同管理成为集团构建核心竞争力的关键因素。企业内部供应链、研制链的业务贯通与协作需要基于统一的数据标准、统一的集成规范开展&#xff0c;数据标准化将成为企业数字化转型的有效赋能手段。 一、客户诉求 近年来&#xff0c;随着国…

OpenAI科学家Jason Wei关于人工智能的回复

问&#xff1a;你的人工智能之路是如何开始的&#xff1f; 答&#xff1a;虽然你们知道我的工作可能是从 2022 年开始的&#xff0c;但我从 2017 年就开始从事人工智能工作了。在达特茅斯大学读本科时&#xff0c;我原本想成为华尔街的一名银行家&#xff0c;这是我父母那一代…