为了将 .NET 5 / .NET Core 应用程序部署到客户机,我们可以编写 Inno Setup 代码来判断客户机是否安装了必要的运行环境。.NET 官方仓库 中提供了一个名为 NetCoreCheck 的项目,可以用于检测指定的 .NET 5 / .NET Core 环境是否存在。编译好的文件可以从以下两个地址下载:

文件名 下载地址
netcorecheck.exe https://go.microsoft.com/fwlink/?linkid=2135256
netcorecheck_x64.exe https://go.microsoft.com/fwlink/?linkid=2135504

需要注意的是,以上两个文件需要依赖 Visual C++ 2015 Redistributable ,如果不具备该环境,则运行会报错。

仅需要将运行环境名称和版本号传递给以上程序即可通过程序的返回值来判断指定的环境是否存在,如果返回值为 0 ,则代表客户机已经安装了指定的运行环境。

@echo off
netcorecheck.exe Microsoft.WindowsDesktop.App 5.0.0
if %ERRORLEVEL% EQU 0 (
echo 已安装
) else (
echo 未安装
)

Inno Setup 脚本编写

在 iss 文件中,我们需要将 netcorecheck.exe 和 netcorecheck_x64.exe 加入到 Files 节点:

[Files]
 
// dotnet core 运行环境检测依赖文件,不需要复制到输出文件。
// download netcorecheck.exe: https://go.microsoft.com/fwlink/?linkid=2135256
// download netcorecheck_x64.exe: https://go.microsoft.com/fwlink/?linkid=2135504
Source: "netcorecheck.exe"; Flags: dontcopy noencryption
Source: "netcorecheck_x64.exe"; Flags: dontcopy noencryption

定义 IsNetCoreInstalled 方法来检测 .net core 环境是否已经安装:

// architecture helper functions
function IsX64: Boolean;
begin
Result := Is64BitInstallMode;
end;
 
function GetString(const x86, x64: String): String;
begin
if IsX64 then begin
Result := x64;
end else begin
Result := x86;
end;
end;
 
function GetArchitectureSuffix: String;
begin
Result := GetString('', '_x64');
end;
// 检测 .net core 环境是否已经安装
// https://github.com/dotnet/deployment-tools/tree/master/src/clickonce/native/projects/NetCoreCheck
function IsNetCoreInstalled(const Version: String): Boolean;
var
ResultCode: Integer;
begin
if not FileExists(ExpandConstant('{tmp}{\}') + 'netcorecheck' + GetArchitectureSuffix + '.exe') then begin
ExtractTemporaryFile('netcorecheck' + GetArchitectureSuffix + '.exe');
end;
Result := ShellExec('', ExpandConstant('{tmp}{\}') + 'netcorecheck' + GetArchitectureSuffix + '.exe', Version, '', SW_HIDE, ewWaitUntilTerminated, ResultCode) and (ResultCode = 0);
end;

使用方法

以下代码展示了检测 .NET 5 运行时的代码:

if IsNetCoreInstalled('Microsoft.NETCore.App 5.0.0') then
begin
Log('Microsoft.NETCore.App 5.0.0 is installed');
end
else
begin
Log('Microsoft.NETCore.App 5.0.0 is not installed');
end;

下面的表格中列出了更多的参数信息:

名称 检验参数
.NET Core 3.1 运行环境 Microsoft.NETCore.App 3.1.0
ASP.NET Core 3.1 运行环境 Microsoft.AspNetCore.App 3.1.0
.NET Core 3.1 桌面运行环境 Microsoft.WindowsDesktop.App 3.1.0
.NET 5 运行环境 Microsoft.NETCore.App 5.0.0
ASP.NET Core 5 运行环境 Microsoft.AspNetCore.App 5.0.0
.NET 5 桌面运行环境 Microsoft.WindowsDesktop.App 5.0.0

引用来源

本文是笔者根据 GitHub 仓库 InnoDependencyInstaller 中的内容整理修改而来。

Inno Setup Dependency Installer 可以在你的应用程序安装过程中下载并安装任何依赖关系,如.NET, Visual C++或SQL Server Express Redistributable! 此外,还可以轻松地添加自己的依赖关系。

  • .NET

    • .NET Framework 1.1
    • .NET Framework 1.1 Service Pack 1
    • .NET Framework 2.0 + Service Pack 2
    • .NET Framework 3.5 + Service Pack 1
    • .NET Framework 4.0 Client
    • .NET Framework 4.0 Full
    • .NET Framework 4.5.2
    • .NET Framework 4.6.2
    • .NET Framework 4.7.2
    • .NET Framework 4.8
    • .NET Core Runtime 3.1
    • ASP.NET Core Runtime 3.1
    • .NET Desktop Runtime 3.1
    • .NET Runtime 5.0
    • ASP.NET Core Runtime 5.0
    • .NET Desktop Runtime 5.0
  • C++
    • Visual C++ 2005 Redistributable
    • Visual C++ 2008 Redistributable
    • Visual C++ 2010 Redistributable
    • Visual C++ 2012 Redistributable
    • Visual C++ 2013 Redistributable
    • Visual C++ 2015-2019 Redistributable
  • SQL
    • SQL Server 2008 Express R2 + Service Pack 2
    • SQL Server 2012 Express + Service Pack 4
    • SQL Server 2014 Express + Service Pack 3
    • SQL Server 2016 Express + Service Pack 2
    • SQL Server 2017 Express
    • SQL Server 2019 Express
  • DirectX End-User Runtime
  • Windows Installer 4.5

在此,感谢仓库作者 DomGries 的辛勤劳动和付出。

// contribute: https://github.com/DomGries/InnoDependencyInstaller
// official article: https://codeproject.com/Articles/20868/Inno-Setup-Dependency-Installer

 

在 Inno Setup 中检测 .NET 5 / .NET Core 运行环境是否存在的更多相关文章

  1. 在Unicode版Inno Setup中使用ISSkin给安装程序添加皮肤

    原文 http://www.cnblogs.com/2356/archive/2009/10/27/1590565.html 在Unicode版Inno Setup中使用ISSkin给安装程序添加皮肤 ...

  2. 如何在 Inno Setup 中关联多种文件格式

    问题描述 Inno Setup 是一款十分强大的 Windows 安装程序制作软件,可以通过编写并编译 iss 脚本来创建安装包.之前都是直接将 Pyinstaller 生成的文件夹压缩为 zip 格 ...

  3. Inno setup中定制安装路径

    我的程序修改了安装界面,所以我的界面中提供了更改安装路径的方法. 用户修改后的路径会被传回inno setup脚本,脚本中需要做的事情如下: 1,写一个函数,来返回新的安装路径,如: function ...

  4. 在Unicode版Inno Setup中使用ISSkin

    ISSkin是Code jock 公司出品的Inno Setup 皮肤插件,用于为Inno制作的安装程序提供皮肤功能. 自Delphi发布2009之后,Inno Setup 开始出现支持Unicode ...

  5. Inno setup 中 执行参数传递注意的地方

    Inno setup编译器编译使用pascal脚本编写的打包代码,其中Run段可以执行某些特定的程序,遇到一个bat批处理文件传递参数的问题,记录如下 1: [Run] 2: Filename: &q ...

  6. Java版人脸检测详解上篇:运行环境的Docker镜像(CentOS+JDK+OpenCV)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  7. 在 Inno Setup 中实现倒数N秒后激活按钮

    原文 http://restools.hanzify.org/article.asp?id=67 timectrl.dll 为一个 6.5 KB 的按钮激活时间控制插件.  引用来自 Example1 ...

  8. Inno Setup中多语言时,使用占位符填充

    如在: [CustomMessages] CreateDesktopIcon=Create a Desktop icon NameAndVersion=%1 version %2 普通的获取Custo ...

  9. 如何在 Inno Setup 中执行命令行的命令

    Pascal Scripting: Exec Prototype: function Exec(const Filename, Params, WorkingDir: String; const Sh ...

  10. Inno Setup中做补丁通过注册表获取原程序安装目录

    今天找VM补丁看到的,是个innosetup封装的,所以习惯性的喜欢去看人家的iss文件是怎么编写的. DefaultDirName={reg:HKLM\SOFTWARE\VMware%2c%20In ...

随机推荐

  1. HarmonyOS实现几种常见图片点击效果

    一. 样例介绍 HarmonyOS提供了常用的图片.图片帧动画播放器组件,开发者可以根据实际场景和开发需求,实现不同的界面交互效果,包括:点击阴影效果.点击切换状态.点击动画效果.点击切换动效. 相关 ...

  2. RabbitMQ总体介绍

    历史-从开始到现在 RabbitMQ是一个Erlang开发的AMQP(Advanced Message Queuing Protocol )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求, ...

  3. vue 插件(swiper)使用

    两种方法: 1... 打开https://www.swiper.com.cn/download/index.html 下载css,js... 把js,css引入public里面的index.html文 ...

  4. Java Agent 踩坑之 appendToSystemClassLoaderSearch 问题

    简介: 从 Java Agent 报错开始,到 JVM 原理,到 glibc 线程安全,再到 pthread tls,逐步探究 Java Agent 诡异报错. 作者:鲁严波   从 Java Age ...

  5. Facebook宕机背后,我们该如何及时发现DNS问题

    ​简介: 国庆期间,Facebook 及其旗下 Instagram 和 WhatsApp 等应用全网宕机,停机时间将近 7 小时 5 分钟,Facebook 市值损失 643 亿美元.针对Facebo ...

  6. [GPT] Unable to negotiate with xx.xx.xx.xx port 22: no matching host key type found. Their offer: ssh-rsa,ssh-dss

      这个错误通常发生在 SSH 客户端无法找到与 SSH服务器 匹配的主机密钥类型时. 这可能是因为SSH服务器配置为使用SSH客户端不支持的主机密钥类型. 要解决此问题,您需要将缺少的主机密钥类型添 ...

  7. [FAQ][Hardhat] Error HH501: Couldn't download compiler version 0.8.0. Please check your connection.

    当使用 npx hardhat compile 命令编译智能合约时,会先下载你在 hardhat.config.js 配置中对应版本的 solidity 编译器. 当网络不可达时,就会提示无法下载的错 ...

  8. [FAQ] golang-migrate/migrate error: default addr for network '127.0.0.1:3306' unknown

    按照项目github文档上所示,在使用 mysql 时你可能会这样写: $ migrate -path db/migrations -database mysql://root:123456@127. ...

  9. WPF 已知问题 RadioButton 指定 GroupName 后关闭窗口可能导致无法选中

    本文记录一个 WPF 已知问题,当 WPF 的 RadioButton 指定 GroupName 且将 IsChecked 状态绑定到 ViewModel 上,将包含以上控件的代码的窗口显示两个,接着 ...

  10. dotnet C# 如何使用 MemoryFailPoint 检查是否有足够的内存资源来执行操作

    在 dotnet 里面的 MemoryFailPoint 可用来测试当前进程是否还能分配申请给定大小的内存空间,这个是一个高级编程的类型,大部分情况下都不需要用到.本文内容由 New Bing 编写, ...