Как я могу установить .NET Framework в качестве предварительного условия с помощью Inno Setup?
У меня есть вопрос, похожий на Inno Setup: убедитесь, что установлен .NET 4.0, но, похоже, он немного отличается.
[Files]
Source: "dependencies\dotNetFx40_Full_x86_x64.exe"; DestDir: {tmp}; Flags: deleteafterinstall; Check: FrameworkIsNotInstalled
Source: "C:\Windows\Microsoft.NET\assembly\GAC_MSIL\MySql.Data\v4.0_6.5.4.0__c5687fc88969c44d\MySql.Data.dll"; DestDir: "{app}\lib"; StrongAssemblyName: "MySql.Data, Version=6.5.4.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, ProcessorArchitecture=MSIL"; Flags: "gacinstall sharedfile uninsnosharedfileprompt"
[Run]
Filename: {tmp}\dotNetFx40_Full_x86_x64.exe; Description: Install Microsoft .NET Framework 4.0; Parameters: /q /norestart; Check: FrameworkIsNotInstalled
[code]
function FrameworkIsNotInstalled: Boolean;
begin
Result := not RegKeyExists(HKEY_LOCAL_MACHINE, 'Software\Microsoft\.NETFramework\policy\v4.0');
end;
Как вы можете видеть, я пытаюсь зарегистрировать файл с помощью GAC. К сожалению, на некоторых машинах возможно, что платформа .NET не установлена. Поэтому мне нужно сначала установить его. Есть ли в любом случае, что я могу принудительно установить среду выполнения .NET, прежде чем пытаться зарегистрировать свои файлы?
Ответы
Ответ 1
Поскольку раздел [Run]
обрабатывается после раздела [Files]
, это, естественно, невозможно сделать с помощью сценария, который вы показали (отсюда и ваш вопрос). Есть несколько способов, по которым я бы рекомендовал выполнить настройку.NET из AfterInstall
параметра AfterInstall
самой записи установки. Таким образом, вы удалите текущий раздел [Run]
и напишите сценарий следующим образом:
[Files]
Source: "dependencies\dotNetFx40_Full_x86_x64.exe"; DestDir: {tmp}; Flags: deleteafterinstall; AfterInstall: InstallFramework; Check: FrameworkIsNotInstalled
Source: "C:\Windows\Microsoft.NET\assembly\GAC_MSIL\MySql.Data\v4.0_6.5.4.0__c5687fc88969c44d\MySql.Data.dll"; DestDir: "{app}\lib"; StrongAssemblyName: "MySql.Data, Version=6.5.4.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, ProcessorArchitecture=MSIL"; Flags: gacinstall sharedfile uninsnosharedfileprompt
[Code]
procedure InstallFramework;
var
ResultCode: Integer;
begin
if not Exec(ExpandConstant('{tmp}\dotNetFx40_Full_x86_x64.exe'), '/q /norestart', '', SW_SHOW, ewWaitUntilTerminated, ResultCode) then
begin
{ you can interact with the user that the installation failed }
MsgBox('.NET installation failed with code: ' + IntToStr(ResultCode) + '.',
mbError, MB_OK);
end;
end;
Процесс прост, если функция Check
элемента установки.NET в разделе [Files]
оценивается как True ( FrameworkIsNotInstalled
), запись обрабатывается, которая копирует двоичный файл установки в временную папку Inno Setup, и если это удастся, AfterInstall
функция InstallFramework
вызывается сразу после. Внутри этой функции настройка.NET выполняется вручную, вызывая функцию Exec
.
И, наконец, если все это удастся, установка продолжит обработку следующей записи раздела [Files]
, которая будет вашей сборкой, которая будет зарегистрирована. Теперь с установленной платформой.NET. Итак, как вы можете видеть, порядок записей раздела [Files]
имеет решающее значение.
Вы также указали в своем комментарии, как показать пользователю некоторый прогресс, поскольку выполнение.NET-установки таким образом, как я разместил здесь, блокирует запись [Files]
, что приводит к отображению остановленного индикатора выполнения и текста о извлечения файлов. Так как было бы непросто получить ход установки установки.NET, я бы просто продемонстрировал пользователю бесконечный индикатор выполнения шага во время выполнения этой установки.
Чтобы сделать это, завершите выполнение установки таким кодом:
procedure InstallFramework;
var
StatusText: string;
begin
StatusText := WizardForm.StatusLabel.Caption;
WizardForm.StatusLabel.Caption := 'Installing .NET framework...';
WizardForm.ProgressGauge.Style := npbstMarquee;
try
{ here put the .NET setup execution code }
finally
WizardForm.StatusLabel.Caption := StatusText;
WizardForm.ProgressGauge.Style := npbstNormal;
end;
end;
Так выглядит форма мастера во время выполнения этой установки.NET (индикатор выполнения анимирован):
![enter image description here]()
Ответ 2
Я просто хочу добавить что-то в @TLama: закрытие при неудачной установке.
Это не так просто, потому что WizardForm.Close;
просто вызывает кнопку отмены, которая может быть прервана пользователем. Наконец, код может выглядеть так:
[Code]
var CancelWithoutPrompt: boolean;
function InitializeSetup(): Boolean;
begin
CancelWithoutPrompt := false;
result := true;
end;
procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
if CurPageID=wpInstalling then
Confirm := not CancelWithoutPrompt;
end;
function FrameworkIsNotInstalled: Boolean;
begin
Result := not RegKeyExists(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full');
end;
procedure InstallFramework;
var
StatusText: string;
ResultCode: Integer;
begin
StatusText := WizardForm.StatusLabel.Caption;
WizardForm.StatusLabel.Caption := 'Installing .NET framework...';
WizardForm.ProgressGauge.Style := npbstMarquee;
try
if not Exec(ExpandConstant('{tmp}\dotNetFx45_Full_asetup.exe'), '/q /norestart', '', SW_SHOW, ewWaitUntilTerminated, ResultCode) then
begin
// you can interact with the user that the installation failed
MsgBox('.NET installation failed with code: ' + IntToStr(ResultCode) + '.',
mbError, MB_OK);
CancelWithoutPrompt := true;
WizardForm.Close;
end;
finally
WizardForm.StatusLabel.Caption := StatusText;
WizardForm.ProgressGauge.Style := npbstNormal;
end;
end;
Ответ 3
только мои 2 цента при проверке .NET Framework 4.7, вписываются прямо в ответ @Snicker:
function FrameworkIsNotInstalled: Boolean;
var
ver: Cardinal;
begin
Result :=
not
(
(RegKeyExists(
HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client')
and
RegQueryDWordValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client', 'Release', ver)
)
or
(RegKeyExists(
HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full')
and
RegQueryDWordValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full', 'Release', ver)
)
)
and (ver < 460798)
end;
Ответ 4
Вы также можете настроить его на загрузку веб-загрузчика и запустить его, если вы не хотите упаковывать его в очень тяжелый полный установщик .NET. Я написал сообщение в блоге о том, как это сделать с помощью плагина Inno Download.