如何使用 NSIS 安装 Visual C++ Redist

gdu*_*bar 6 installation nsis visual-studio visual-c++

我的 C++ 应用程序需要安装 Visual Studio C++ 可再发行组件。我正在使用 Visual Studio 2019 社区版。我使用 NSIS(版本 3.04)来创建我的安装程序。我是否应该尝试检测 redist 是否已安装,并且仅在它不是最新的情况下才安装它?

gdu*_*bar 6

关于如何执行此操作有多种答案,包括许多如何检测是否安装了 redist 的方法。我不会说所有这些都是不完整的并且不能以面向未来的方法工作,但我还没有在它们上取得成功。所以,我认为最好的办法就是始终安装 redist,然后让 Microsoft 来处理它。截至 2020 年 3 月,这将为您的安装程序增加 14MB,但也许在这个高速互联网时代,这并不像以前那么重要。幸运的是,这非常简单,希望这个问题能让您避免遵循我所做的所有过时的参考资料和链接。

有关 Microsoft redist 的说明可在此处找到:重新分发 Visual C++ 文件

要将其转换为 NSIS:

在 Visual Studio 安装中找到要重新分发的文件。对我来说这是:

C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Redist\MSVC\14.25.28508\vcredist_x86.exe
Run Code Online (Sandbox Code Playgroud)

版本号将来肯定会发生变化 (14.25.28508),可能只是在安装 Visual Studio 更新时发生,因此请记住,当安装程序中断时,您需要更新该路径。您还需要在 vcredist_x86.exe 和 vcredist_x64.exe 之间进行选择,具体取决于您将应用程序构建为 32 位还是 64 位。

可能在进行主安装之前,将这样的部分添加到您的 NSIS 安装文件中。它所做的就是将 redist 文件复制到文件系统中,运行它,等待完成,然后删除 redist 文件。

Section "Visual Studio Runtime"
  SetOutPath "$INSTDIR"
  File "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Redist\MSVC\14.25.28508\vcredist_x86.exe"
  ExecWait "$INSTDIR\vcredist_x86.exe"
  Delete "$INSTDIR\vcredist_x86.exe"
SectionEnd
Run Code Online (Sandbox Code Playgroud)

将正确的路径替换为您要使用的 redist 文件。

正如所写的(以及当前的 redist 程序行为),这将弹出一个对话框,用户必须按照该对话框安装 redist。您可以替代安静模式:

ExecWait '"$INSTDIR\vcredist_x86.exe" /quiet'
Run Code Online (Sandbox Code Playgroud)

然而我并没有得到好的结果。YMMV。