【问题标题】:How to Install the Visual C++ Redist Using NSIS如何使用 NSIS 安装 Visual C++ Redist
【发布时间】:2020-05-29 18:07:13
【问题描述】:

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

【问题讨论】:

  • 谢谢佩里,完成!

标签: visual-studio visual-c++ installation nsis


【解决方案1】:

关于如何执行此操作有多种答案,包括如何检测是否安装了 redist 的许多方法。我不会说它们所有都是不完整的,并且在未来的证明方法中不起作用,但我没有成功。所以,我认为最好的办法就是始终安装 redist 并让 Microsoft 来处理它。截至 2020 年 3 月,这将为您的安装程序增加 14MB,但也许在这个高速互联网时代,这已经不是什么大问题了。幸运的是,这很简单,希望这个问题能让你不再关注我所做的所有过时的参考资料和链接。

可以在此处找到有关 Microsoft 的 redist 的说明:Redistributing Visual C++ Files

要将其转换为 NSIS:

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

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

版本号在未来肯定会发生变化 (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

用正确的路径替换你要使用的 redist 文件。

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

ExecWait '"$INSTDIR\vcredist_x86.exe" /quiet'

但是我没有得到很好的结果。 YMMV。

【讨论】:

【解决方案2】:

要使其他开关正常工作,请将它们包含在引号中。 所以上面的 ExecWait 命令如下:

ExecWait "$INSTDIR\vcredist_x86.exe /install /quiet"

我目前正在使用它,但是使用“/quiet”开关,实际的 NSI 安装程序进度会挂起,直到安装了 redist。

使用 "/passive" 代替将给出关于 redist 安装的进度报告

【讨论】:

    【解决方案3】:

    我同意 gdunbar 的观点,即检测方法既复杂又不那么可靠,此类方法的良好总结在此线程中:Detect if Visual C++ Redistributable for Visual Studio 2012 is installed 但是我不想总是在安装程序中包含 VC redist,因为它会显着增加安装程序的大小(例如 VC++ 2019 可再发行组件是 24Mb,而我没有它的安装程序是 1Mb)。所以我最终使用了我认为非常可靠的方法来尝试运行可执行文件,并在需要时动态下载安装程序。下面是 VC++ 2019 可再发行组件的详细信息:

    1. 创建控制台窗口应用程序,例如Visual Studio 2019 向导创建此代码:

      #include <iostream>
      
      int main()
      {
          std::cout << "Hello World!\n";
          return 0;
      }
      

      这个应用的大小是12K(编译时带有“Favor small size”选项)。

    2. 在 NSIS 中使用以下代码运行它并在需要时下载安装程序:

      InitPluginsDir
      ;the hello word console app
      ;need to use nsExec plugin to prevent error popup (if redist is missing)
      File /oname=$PLUGINSDIR\checkRedist.exe checkRedist.exe
      nsExec::Exec '"$PLUGINSDIR\checkRedist.exe"'
      Pop $0
      
      ${If} $0 != 0
          DetailPrint "VC++ Redistributable package is missing!"
          inetc::get "https://aka.ms/vs/16/release/vc_redist.x64.exe" $PLUGINSDIR\vcredist.exe
          DetailPrint "Installing Visual Studio Redistributable package..."
          ExecWait '"$PLUGINSDIR\vcredist.exe" /q /norestart'
          DetailPrint "Done"
      ${Else}
          DetailPrint "VC++ Redistributable already installed"
      ${EndIf}
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多