18 February, 2009

Debug Visual C++ Redistributable Package своими руками

Довольно частое явление когда у клиента девственно чистый компьютер - в смысле без Visual Studio, а вам необходимо запустить debug версию вашего приложения на C++ для отладки например. Если ваша сборка использует динамическую линковку системных DLL, то почти наверняка ваше приложение не загрузится. Скорее всего причина кроется в том, что у клиента не установлен Visual C++ Redistributable Package. На сайте Microsoft лежат такие package, но только для release, для debug вы их там не найдете:
Так как же быть? Создадим такой package сами. Открываем Visual Studio, создаем новый solution. В диалоге выбора типа проекта выбираем Other Project Typoes|Setup Project. Потом добавляем необходимые merge module в проект и компилируем. Учтите, что для каждой платформы будь то x86 или x64 необходимо создать свой project в solution. Не забываем добавлять соответствующие policy. В х64 вариант обьязательно добавляем merge module для x86. Ниже приведен список необходимых merge module для:
Visual Studion 2005 (DebugCRT x86)
  • Microsoft_VC80_DebugCRT_x86.msm
  • policy_8_0_Microsoft_VC80_DebugCRT_x86.msm
Visual Studion 2005 (DebugCRT x64)
  • Microsoft_VC80_DebugCRT_x86.msm
  • Microsoft_VC80_DebugCRT_x86_x64.msm
  • policy_8_0_Microsoft_VC80_DebugCRT_x86.msm
  • policy_8_0_Microsoft_VC80_DebugCRT_x86_x64.msm
Visual Studion 2008 (DebugCRT x86)
  • Microsoft_VC90_DebugCRT_x86.msm
  • policy_9_0_Microsoft_VC90_DebugCRT_x86.msm
Visual Studion 2008 (DebugCRT x64)
  • Microsoft_VC90_DebugCRT_x86.msm
  • Microsoft_VC90_DebugCRT_x86_x64.msm
  • policy_9_0_Microsoft_VC90_DebugCRT_x86.msm
  • policy_9_0_Microsoft_VC90_DebugCRT_x86_x64.msm
Если вы используете MFC, то дополнительно добовляете MFC merge module в соответствующий проект по аналогии - имена должны содержать DebugMFC.
Остается только скомпилировать ваш solution и в результате вы получите msi для установки на компьютере клиента. Рекомендую также правильно и солидно назвать исталляцию и сменить имя msi файла, чтобы на стороне клиента это все не выглядело поделкой на коленке.
P.S. Стиль когда нужные сисетмные DLL кладутся в проект рядом с вашим приложением на мой взгляд является анахронизмом, хоть и работает. С другой стороны мне несложно придумать конфигурацию, когда такой фокус уже не прокатит. Самый простой пример: ваше приложение для x86 и для x64 лежат в одном каталоге.
P.P.S Все доступные merge module хрянятся в "%CommonProgramFiles%\Merge Modules".

1 comment:

Кисельгов said...

Спасибо, ваша заметка помогла в решении моей проблемы с MSVS++ 2008 SP1 и ее MFC пакетом ( http://23w.livejournal.com/3744.html ).
Только наверное студия не совсем подходит к построению такого пакета Release + Debug модулей, т.к. в ней нет возможности сделать инсталлятор в котором отключена возможность деинсталяции. Иначе, сняв пакет снимаются и VC модули (даже если они до этого были установлены в системе другим инсталлятором), проверено на XP.