Могу ли я подключить распространяемую DLL-версию Visual Studio 2015 C++ к моему приложению?

Я создал приложение C++, используя Microsoft Visual Studio 2015 Community Edition. Я использую Advanced Installer, чтобы убедиться, что Visual C++ Redistributable для Visual Studio 2015 является обязательным условием.

Однако распространяемый установщик не идеален. Некоторые из моих пользователей сообщили, что распространяемый установщик зависает, или он не может установить, когда он говорит, что он делает, а затем пользователи получают сообщение "Эта программа не может запускаться из-за ошибки MSVCP140.dll с вашего компьютера".

По словам Microsoft, теперь я могу упаковать распространяемые DLL вместе с моим приложением, хотя они не рекомендуют:

Чтобы развернуть распространяемые Visual C++ файлы, вы можете использовать Visual C++ Распространяемые пакеты (VCRedist_x86.exe, VCRedist_x64.exe или VCRedist_arm.exe), которые включены в Visual Studio.... Также возможно напрямую установить распространяемые библиотеки Visual C++ DLL в локальной папке приложения, которая является папкой, содержащей файл исполняемого файла. По причинам обслуживания мы не рекомендуем использовать это место установки.

Есть 4 файла в C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\redist\x64\Microsoft.VC140.CRT. Означает ли это, что мне просто нужно скопировать их в каталог приложений во время процесса установки?

  • MyApp.exe
  • concrt140.dll
  • msvcp140.dll
  • vccorlib140.dll
  • vcruntime140.dll

Это нормально? Нужно ли показывать лицензию? Почему больше людей не делают этого вместо того, чтобы требовать еще одну предустановку распространяемого?

Ответ 1

Есть 4 файла в C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\redist\x64\Microsoft.VC140.CRT. Означает ли это, что мне просто нужно скопировать их в каталог приложений во время процесса установки?

Да, и пункт, который вы цитируете, означает именно это.

Это нормально? Нужно ли показывать лицензию? Почему больше людей не делают этого вместо того, чтобы требовать еще одну предустановку распространяемого?

Технически, это нормально делать. Если вы хотите быть педантичным, вы можете включить примечание в readme или help/about том, что VC++ 2015 redistributables provided in "local deployment" mode как это явно разрешено Microsoft Deployment в Visual C++.

Что касается того, почему больше людей этого не делают, я бы предположил, что (среди тех, кто вообще ухаживает):

  • для одного приложения модуля, такого как MyApp.exe проще построить его со всем, связанным статически, с целью устранения внешних зависимостей;
  • не включая эти файлы, сохраняет 1+ MB из дистрибутива (предположительно загружаемого) размера;
  • работа с частными копиями среды выполнения ("local deployment") изменяет ответственность за обновления для сопровождающего, так что в случае критического/безопасного исправления пакет должен быть переиздан своевременно - в отличие от "central deployment" где он скорее всего, будет доставлен через Центр обновления Windows, причем как хорошие, так и плохие, которые могут принести.

Ответ 2

Если у вас возникли проблемы с установщиком предварительных условий, у вас также есть возможность установить распределяемые модули как модули слияния. Как упоминается в той же статье MSDN:

Другой вариант - использовать распространяемые модули слияния (файлы.msm), которые можно найти в Program Files [(x86)]\Common Files\Merge Modules.

Используя модули слияния, это намного более чистый вариант, чем ручное добавление файлов. Файлы могут быть случайно удалены другим коллегой, который не знает, почему они там, или один из них не может быть установлен и т.д.

Все выпуски Advanced Installer имеют поддержку для включения модулей слияния, включая бесплатную версию.