如何使用 Inno Setup 安装 .NET Framework 作为先决条件?

2023-11-23

我有一个类似的问题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 框架可能是not安装。所以我需要先安装它。无论如何,我可以强制安装 .NET 运行时before我尝试注册我的文件?


自从[Run]部分处理后[Files]部分,用您所显示的脚本自然不可能做到这一点(因此您的问题)。有几种方法,我推荐的一种方法是从以下位置执行 .NET 设置: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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Inno Setup 安装 .NET Framework 作为先决条件? 的相关文章

  • 在哪里可以下载没有 Visual Studio 2010 的 C# 4.0 编译器?

    我知道 CTP VS 2010 映像 但我可以只下载 NET Framework 4 0 和 C 编译器吗 AFAIK VS 2010 CTP 仅作为 VM 映像提供 我不相信 Microsoft 发布了 VS 的安装程序 其中一个绝对不适
  • 调试VS 2005提示“操作不支持”

    我一直在调试 VS 2005 并将 启动外部程序 设置为 C Program Files Microsoft Visual Studio 10 0 Common7 IDE devenv exe 但按 F5 后出现此错误 尝试运行项目时出错
  • 获取低阶 N 位

    有什么方法可以获得任何整数的低阶n位 其中n可以是 1 到 32 之间的任意数字 无需预先计算 32 个位掩码 每个订单一个 并使用 操作员 我也不想使用 具有 2 的幂 只是按位运算 Edit 例如 假设用户输入一个整数Num和另一个整数
  • 使用 .Net 创建 CalDAV 服务

    我想在我的应用程序中创建一个外部用户可以查看的日历 CalDAV 基本上是 WebDAV iCalendar 格式似乎得到了相对广泛的支持 尽管某些客户端 例如 Outlook 不太支持这种格式 不过对我来说完全是新的 我想外部发布事件 我
  • 将 MVC 操作结果发送到打印机

    我有一个带有操作的控制器 SomeController ActionToBePrinted ActionToBePrinted 返回一个 html 视图 当按下按钮时 从普通的 mvc razor 视图调用此操作 当按下按钮时 我将如何将视
  • C# Winform - 当用手指在触摸屏上移动到控件末尾时如何防止移动整个窗口

    我正在开发用于触摸屏的全屏 winform 应用程序 当我在表单上有任何控件时 例如listbox webBrowserControl 它具有可见的滚动条 有要滚动的内容 当我用手指移动到控件的末尾时 完整的表单向上 向下移动取决于移动方向
  • 性能:XmlSerializer、XmlReader、XmlDocument、XDocument

    我正在开发一个小型 Web 项目 并且想要读取 写入 XML 文件 性能是我的首要任务 我已经来到这篇很棒的文章 http www nearinfinity com blogs joe ferner performance linq to
  • .NET 中应用程序域的常见用途和最佳实践?

    关于何时在应用程序中创建新的应用程序域 有哪些准则和最佳实践 另外 有哪些常见用途以及如何在应用程序中使用多个应用程序域的示例 我见过的最常见的场景是能够通过与主程序不同的安全模型提供可扩展性 在单独的 AppDomain 中加载插件可以实
  • 如何从当前 .NET 表单/应用程序发送密钥 F12

    我非常确定以下按钮激活的表单代码应该在我的 C 应用程序中引发 Control F12 SendKeys F12 但它似乎并没有继续进入 Windows shell 并激活另一个正在侦听它的程序 我的键盘可以用 看起来发送键在某处被拦截 并
  • [程序名称].exe已停止工作

    我有一个基于 Framework 2 0 构建的 NET 应用程序 我已经为它构建了一个安装程序 并尝试在具有 3 5 的计算机上运行它 所有相关环境均在Windows 7上 该应用程序在我的开发机器上以 VS 调试模式完美运行 该机器也具
  • 实体框架 SQLite 错误 1:“没有这样的表:__EFMigrationsHistory”

    我在 Windows 和 Linux 上运行 EF Core 并且在两者上都遇到相同的问题 public string DbPath get string DbPath Environment GetFolderPath Environme
  • 为什么 C# ProcessStartInfoRedirectStandardOutput 会导致 xcopy 进程失败

    这有点痛苦 因为我现在没有代码 但我会尽力解释 我有一个简单的 C 应用程序 它启动 Ruby 脚本 它还执行一些其他操作 因此它生成一个批处理文件并执行该文件 我正在使用 C 进程对象并设置以下内容 重定向标准输出 true 重定向标准错
  • 如何使用 c# 编写几个精确的计时器(精确到 10 毫秒间隔)

    我已经开始使用 C VS2010 Net Fw 4 0 进行桌面应用程序开发 涉及多个计时器 起初 我使用的是系统定时器为了通过 USB 将数据发送到数据总线 我的观点是 我需要以几个特定的 时间间隔发送不同的周期性二进制消息 例如 10m
  • Visual Studio 2010 的“线程”窗口中的 和 [Thread Destroyed] 详细信息

    我一直在尝试调试与一个应用程序的线程相关的一些问题 当我附加到应用程序时 我看到一个像这样的窗口 这个名为 Thread Destroyed 的线程是什么 应用程序代码肯定不会写这个名称 这意味着线程的调用堆栈不可用 采集引擎 线程在应用程
  • 在音频文件中查找音频样本(频谱图已存在)

    我正在努力实现以下目标 使用 Skype 拨打我的邮箱 有效 输入密码并告诉邮箱我要录制新的欢迎信息 有效 现在 我的邮箱告诉我在嘟嘟声后录制新的欢迎消息 我想等待蜂鸣声然后播放新消息 不起作用 我如何尝试实现最后一点 使用 FFT 和滑动
  • 如何更改特定元素的 XML 命名空间

    我有一些通过某些 WCF 消息的 xmlserialization 生成的 xml 集 现在我想创建一个通用方法 在其中提供 xml 文件名和前缀 例如mailxml12 然后在 xml 文件中 那些名称中没有任何命名空间前缀的元素应替换为
  • VLC 媒体播放器有 C# 界面吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否可以使用 C 控制台应用程序中的包装器从 VLC 播放中当前播放的文件中读取曲目统计信息 时间 标
  • 如何从字符串中提取子字符串直到遇到第二个空格?

    我有一个像这样的字符串 o1 1232 5467 1232 5467 1232 5467 1232 5467 1232 5467 1232 5467 如何仅提取 o1 1232 5467 要提取的字符数并不总是相同 因此 我只想提取直到遇到
  • 在哪里可以找到 Microsoft.Build.Utilities.v3.5

    如何获取 Microsoft Build Utilities v3 5 我正在使用 StyleCop 4 7 Stylecop dll 中的 StyleCop msbuild 任务似乎依赖于 Microsoft Build Utilitie
  • 调用 .ToArray() 时出现 ArgumentException

    我有一个经常被清除的列表 代码完全是这样的 VisitorAgent toPersist List

随机推荐