InnoSetup:检查 .NET Framework - 安装不工作
Posted
技术标签:
【中文标题】InnoSetup:检查 .NET Framework - 安装不工作【英文标题】:InnoSetup: Check .NET Framework - installation not working 【发布时间】:2017-04-05 02:33:27 【问题描述】:您好,我正在尝试在我的 Inno 安装脚本中集成 .NET Framework 版本检查和自动安装。
我正在使用我在这里找到的代码:.../installing-net-framework-4-5-automatically-with-inno-setup/`
问题是,代码不起作用。该脚本编译并输出正常。 当我尝试在 VM 中运行设置时,一切正常。
但是,我没有看到实际安装的 .NET Framework。 只是一个 10 秒的快速进度窗口,显示正在提取的各种文件(如下所示)。 然后它消失了,我的设置完成了。
当我尝试启动我的程序时,它报告未安装 .NET Framework。
这是完整的代码:
#include <idp.iss>
function Framework45IsNotInstalled(): Boolean;
var
bSuccess: Boolean;
regVersion: Cardinal;
begin
Result := True;
bSuccess := RegQueryDWordValue(HKLM, 'Software\Microsoft\NET Framework Setup\NDP\v4\Full', 'Release', regVersion);
if (True = bSuccess) and (regVersion >= 378389) then begin
Result := False;
end;
end;
procedure InitializeWizard;
begin
if Framework45IsNotInstalled() then
begin
idpAddFile('http://go.microsoft.com/fwlink/?LinkId=397707', ExpandConstant('tmp\NetFrameworkInstaller.exe'));
idpDownloadAfter(wpReady);
end;
end;
procedure InstallFramework;
var
StatusText: string;
ResultCode: Integer;
begin
StatusText := WizardForm.StatusLabel.Caption;
WizardForm.StatusLabel.Caption := 'Installing .NET Framework 4.5.2. This might take a few minutes…';
WizardForm.ProgressGauge.Style := npbstMarquee;
try
if not Exec(ExpandConstant('tmp\NetFrameworkInstaller.exe'), '/passive /norestart','', SW_SHOW, ewWaitUntilTerminated, ResultCode) then
begin
MsgBox('.NET installation failed with code: ' + IntToStr(ResultCode) + '.', mbError, MB_OK);
end;
finally
WizardForm.StatusLabel.Caption := StatusText;
WizardForm.ProgressGauge.Style := npbstNormal;
DeleteFile(ExpandConstant('tmp\NetFrameworkInstaller.exe'));
end;
end;
procedure CurStepChanged(CurStep: TSetupStep);
begin
case CurStep of
ssPostInstall:
begin
if Framework45IsNotInstalled() then
begin
InstallFramework();
end;
end;
end;
end;
我尝试分解代码并试图找出问题所在。不幸的是,我无法识别它。
任何帮助将不胜感激。谢谢!
【问题讨论】:
那么,如果您手动运行NetFrameworkInstaller.exe /passive /norestart
,会发生什么?它是否正确安装了 .NET 框架?
向我们展示安装程序日志文件 (NetFrameworkInstaller.exe /log c:\path\to\log.log
)!
另请注意,您可以integrate the .NET framework installation into your installer。
你是对的。日志指出由于磁盘空间不足,安装失败。并感谢集成链接。现在就去查。
【参考方案1】:
好吧,我终于确定了这个问题,这是一个令人尴尬的问题。我的 VM 没有足够的空间,但在设置脚本过程 InstallFramework
中没有正确报告此错误。
条件if not Exec(ExpandConstant('tmp\NetFrameworkInstaller.exe'), '/passive /norestart','', SW_SHOW, ewWaitUntilTerminated, ResultCode) then
始终返回False
,即使.NET Framework 安装失败。
正确的方法是直接调用Exec(ExpandConstant('tmp\NetFrameworkInstaller.exe'), '/passive /norestart','', SW_SHOW, ewWaitUntilTerminated, ResultCode)
,然后检查实际的ResultCode
,看看.NET Framework安装是否成功。在原始脚本中,这个ResultCode
的值为5100
(空间不足)。
所以,我相应地修改并修复了例程。
procedure InstallFramework;
var
StatusText: string;
ResultCode: Integer;
begin
StatusText := WizardForm.StatusLabel.Caption;
WizardForm.StatusLabel.Caption := 'Installing .NET Framework 4.5.2. This might take a few minutes...';
WizardForm.ProgressGauge.Style := npbstMarquee;
try
Exec(ExpandConstant('tmp\NetFrameworkInstaller.exe'), '/passive /norestart', '', SW_SHOW, ewWaitUntilTerminated, ResultCode)
if ResultCode <> 0 then
begin
MsgBox('.NET installation failed with code: ' + IntToStr(ResultCode) + '.' + #13#10 + #13#10 + 'Setup will now terminate.', mbError, MB_OK);
DeleteFile(ExpandConstant('tmp\NetFrameworkInstaller.exe'));
Exterminate;
end
else
begin
WizardForm.StatusLabel.Caption := StatusText;
WizardForm.ProgressGauge.Style := npbstNormal;
end;
finally
DeleteFile(ExpandConstant('tmp\NetFrameworkInstaller.exe'));
end;
end;
如果 .NET Framework 安装失败,Exterminate
过程会中止设置(没有提示)。
var
ForceClose: Boolean;
procedure Exterminate;
begin
ForceClose:= True;
WizardForm.Close;
end;
procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
Confirm:= not ForceClose;
end;
【讨论】:
以上是关于InnoSetup:检查 .NET Framework - 安装不工作的主要内容,如果未能解决你的问题,请参考以下文章
InnoSetup打包exe安装应用程序,并添加卸载图标 转