使用 Inno Setup 和 InnoDependencyInstaller 检测 .NET8

问题描述 投票:0回答:1

我正在考虑使用

InnoDependencyInstaller
,它有一个在幕后使用的功能:

Dependency_AddDotNet80

procedure Dependency_AddDotNet80;
begin
  // https://dotnet.microsoft.com/download/dotnet/8.0
  if not Dependency_IsNetCoreInstalled('-n Microsoft.NETCore.App -v 8.0.0') then begin
    Dependency_Add('dotnet80' + Dependency_ArchSuffix + '.exe',
      '/lcid ' + IntToStr(GetUILanguage) + ' /passive /norestart',
      '.NET Runtime 8.0.0' + Dependency_ArchTitle,
      Dependency_String('https://download.visualstudio.microsoft.com/download/pr/593685c9-7e98-455a-8e34-4b8ad1be9489/6ccf85c6fc244428d61f74ca3aee0645/dotnet-runtime-8.0.0-win-x86.exe', 'https://download.visualstudio.microsoft.com/download/pr/7f4d5cbc-4449-4ea5-9578-c467821f251f/b9b19f89d0642bf78f4b612c6a741637/dotnet-runtime-8.0.0-win-x64.exe'),
      '', False, False);
  end;
end;

我的疑问是通过这个测试:

if not Dependency_IsNetCoreInstalled('-n Microsoft.NETCore.App -v 8.0.0')

我认为.NET8的最新安装程序比

8.0.0
更好。那么这个测试会失败吗?我会在 GitHub 存储库页面上询问,但无法在那里创建问题。


脚注:这是一个关于这个主题的相关问题,它指的是

8.0.3


更新

我想我至少会尝试在我拥有的笔记本电脑上安装并手动运行控制台应用程序。

因此,在

InitializeSetup
中,我调用
Dependency_AddDotNet80;
并编译我的软件。而且,我在笔记本电脑上运行安装程序。

它显示以下内容:

因此表明它将安装.NET Runtime 8.0.0 (x86)。两个问题:

  1. 指的是
    8.0.0
  2. 指的是
    x86

我的应用程序是为

AnyCPU
构建的,但这是一台 64 位笔记本电脑。安装后我尝试运行控制台应用程序:

它找不到

x64
运行时。深入研究 GitHub 示例/存储库,我发现有一个
Dependency_ForceX86
变量,并且在代码中的一个位置使用了它:

function Dependency_IsX64: Boolean;
begin
  Result := not Dependency_ForceX86 and Is64BitInstallMode;
end;

我想我现在离题了!回到我最初关于

Dependency_IsNetCoreInstalled
的查询,我发现它是这样做的:

function Dependency_IsNetCoreInstalled(const Version: String): Boolean;
var
  ResultCode: Integer;
begin
  // source code: https://github.com/dotnet/deployment-tools/tree/main/src/clickonce/native/projects/NetCoreCheck
  if not FileExists(ExpandConstant('{tmp}{\}') + 'netcorecheck' + Dependency_ArchSuffix + '.exe') then begin
    ExtractTemporaryFile('netcorecheck' + Dependency_ArchSuffix + '.exe');
  end;
  Result := ShellExec('', ExpandConstant('{tmp}{\}') + 'netcorecheck' + Dependency_ArchSuffix + '.exe', Version, '', SW_HIDE, ewWaitUntilTerminated, ResultCode) and (ResultCode = 0);
end;

不知道以上内容对您有帮助吗?所以我基本上有两个相关的查询:

  1. 我们如何确保我们正在使用此系统检查(并下载)最新 .NET8?理想情况下,给用户的反馈应该说明这一点,例如。

    8.0.3

  2. 我们如何安装 .NET8 运行时的

    x86
    (如果需要)
    x64
    版本?

遗憾的是,这个优秀的 GitHub 工具没有在安装日志中添加任何日志记录。我唯一收集到的信息是它已下载

netcorecheck.exe
到临时文件夹中以便在安装过程中使用。

我现在已在他的文章中添加了评论,但处于适度状态。


我注意到他在文章中说:

依赖项是根据系统架构安装的。如果你想在 64 位系统上安装 32 位依赖项,你可以强制使用 32 位模式,如下所示:

Dependency_ForceX86 := True;  // force 32-bit install of next dependencies
Dependency_AddVC2013;
Dependency_ForceX86 := False; // disable forced 32-bit install again

但是我使用以下代码在 Windows 11 x64 上进行了测试:

  begin
  if Is64BitInstallMode then
    MsgBox('Installing in 64-bit mode', mbInformation, MB_OK)
  else
    MsgBox('Installing in 32-bit mode', mbInformation, MB_OK);

  begin
  if IsWin64 then
    MsgBox('Is Win 64', mbInformation, MB_OK)
  else
    MsgBox('Is Win 32', mbInformation, MB_OK);
  end;  end;
  1. 它说它是 Win 64。很好。
  2. 但它也说它正在以 32 位模式安装。不好。

我的安装程序适用于两者。它在同一文件夹中包含 32 位和 64 位可执行文件。我就是这么做的。

所以他的代码中的这一点返回的是 x86:

function Dependency_IsX64: Boolean;
begin
  Result := not Dependency_ForceX86 and Is64BitInstallMode;
end;
inno-setup inno-dependency-installer
1个回答
0
投票

评论中建议我在 CodeProject 上问这个问题。所以我就这么做了:

使用 Inno Setup 和 Inno Dependency Installer 检测 .NET8

这是因为实际的 GitHub 项目在该平台上进行了广告:

Inno Setup 依赖安装程序

得到的回应是:

由于这似乎使用

netcorecheck
,这意味着版本检查是一个精确的版本,因此在内部传递
8.0.0
会查看是否安装了该版本,因此如果您需要
8.0.3
,则必须通过在.

因此,我为此问题创建了一个 pull request

至于不安装 x64 版本 .NET8 的问题……我决定更改为构建两个不同的安装程序,一个用于 32 位,一个用于 64 位,每个安装程序都转到正确的程序文件文件夹。

© www.soinside.com 2019 - 2024. All rights reserved.