Tuesday, November 17, 2009

Версия VC90 runtime

На прошлой неделе я совершенно случайно натолкнулся на то что C++ приложения скомпилированные на Visual Studio 2008 SP1 по умолчанию используют RTM версию VC90 runtime. Как описано в блоге одного из разработчиков VC++ в Visual Studio 2008 изменилась стратегия привязки к верии runtime.

Это могло быть оставлено незамеченным, если бы мы не решили использовать регулярные выражения из TR1 которые появились в VC++ c выходом Visual Studio 2008 SP1.

В следствии, приложение начало выдавать ошибку при запуске в тестовой среде.

Сначала оказалось, что при инсталяции нашего приложения, мы использовали инсталяционный модуль Microsoft_VC90_CRT_x86.msm предыдущей версии 9.0.21022.8. Но после того как это было исправлено и мы добавили модуль версии 9.0.30729.1 приложение перестало запускаться вовсе. В Event Viewer появились ошибки о том что не найдена сборка Microsoft.VC90.CRT версии 9.0.21022.8. Проблема оказалась в том, что в манифесте приложения указана RTM (9.0.21022.8) версия Runtime компонент.

В результате поиска решения, было найдено два варианта:

  1. Использовать директиву компиляции _BIND_TO_CURRENT_CRT_VERSION. Тогда в манифест попадёт версия того Runtime который используется студией при сборке проекта.
  2. Добавить в инсталяцию модуль policy_9_0_Microsoft_VC90_CRT_x86.msm. В этом случае, приложение будет использовать более новую версию Runtime, по отношению к той что указана в манифесте.

No comments:

Post a Comment