Обнаружение .NET8 с помощью Inno Setup и InnoDependencyInstaller

Я рассматриваю использование 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 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;

Не знаете, поможет ли в этом вышеизложенное? Итак, у меня по сути есть 2 связанных запроса:

  1. Как мы можем гарантировать, что проверяем (и загружаем) последнюю версию .NET8 с помощью этой системы? В идеале это должно быть указано в отзывах пользователей, например. 8.0.3.

  2. Как мы можем установить обе версии x86 (если требуется) и x64 среды выполнения .NET8?

Жаль, что этот замечательный инструмент GitHub не добавляет никаких записей в журнал установки. Единственное, что я понял, это то, что он загрузил netcorecheck.exe во временную папку для использования во время установки.

Я добавил комментарий к его статье, но он находится на модерации.


Я заметил, что в своей статье он говорит:

Зависимости устанавливаются на основе архитектуры системы. Если вы хотите установить 32-битные зависимости в 64-битной системе, вы можете принудительно установить 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;

Просмотры и репутация CodeProject могут помочь этому автору, поэтому вам следует попытаться оставить свой вопрос там, чтобы связаться с автором (и, вероятно, почему в этом репозитории нет раздела проблем).

Lex Li 06.04.2024 16:44

@LexLi Вот так (codeproject.com/Questions/5380204/…). На данный момент находится в модерации.

Andrew Truckle 06.04.2024 17:10

@LexLi, ты имеешь в виду здесь: codeproject.com/Articles/20868/Inno-Setup-Dependency-Install‌​er

Andrew Truckle 06.04.2024 19:17

Я создал запрос на извлечение для бита 8.0.3. github.com/DomGries/InnoDependencyInstaller/pull/92

Andrew Truckle 06.04.2024 22:33
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
4
338
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В комментариях мне предложили задать этот вопрос на CodeProject. Так я и сделал:

Обнаружение .NET8 с помощью Inno Setup и Inno Dependency Installer

Это связано с тем, что на этой платформе рекламируется настоящий проект GitHub:

Установщик зависимостей Inno Setup

Ответ там был:

Поскольку здесь используется netcorecheck, это означает, что проверка версии является точной версией, поэтому передача 8.0.0 внутрь проверяет, установлена ​​ли эта версия, поэтому, если вам нужно 8.0.3, ее придется передать.

Поэтому я создал pull request для этой проблемы.

Что касается проблемы с невозможностью установки 64-разрядной версии .NET8… Я решил создать два отдельных установщика: один для 32-разрядной версии и один для 64-разрядной версии, каждый из которых находится в правильной папке с программными файлами.


Обновлять

Запрос на включение принят и объединен. 👍

Другие вопросы по теме