Есть ли побочные эффекты использования макроса _BIND_TO_CURRENT_VCLIBS_VERSION?
Мы переносим проект VС++ из Visual Studio 2003 в Visual Studio 2008 SP1 (9.0.30729.4148). Зависимые внешние библиотеки также
скомпилированный с помощью Visual Studio 2008 SP1.
MainApp - Main application Compiled with VS SP1 9.0.30729.4148
ExtStaticLib1 - External static library compiled with VS SP1 9.0.30729.4148
ExtDynamicDll1 - External DLL compiled with VS SP1 9.0.30729.4148
Существует два сценария развертывания для основного приложения:
- Машина с правами администратора пользователя:
Мы рекомендовали поставить предварительный запрос на установку распространяемого пакета Visual Studio перед использованием приложения MainApp. Это хорошо работает, поскольку пользователь имеет права администратора и установка распространяемого пакета не имеет проблем. Связывание приложений с виртуальными DLL файлами VC в папках WinSxS автоматически.
- Машина с пользователем без администратора:
Этот сценарий проблематичен. Пользователь не имеет прав администратора. Следовательно, установить VS2008SP1 пакет перераспределяемого пакета невозможно.
Мы делаем следующее, чтобы решить эту проблему:
-
Скомпилируйте объекты MainApp с помощью макроса _BIND_TO_CURRENT_OPENMP_VERSION (для всех проектов в MainApp).
-
Распространяйте распространяемые DLL-библиотеки VS2008SP1 как частные сборки и скопируйте их в каталог установки приложения.
Вопросы:
- Есть ли какой-либо побочный эффект использования флага _BIND_TO_CURRENT_VCLIBS_VERSION (Специально, когда совместно распространяются пакеты VC и частные сборки VC-переименования)?
- У нас нет большого контроля над внешними библиотеками ExtStaticLib1, ExtDynamicDll1 и, следовательно, они не будут скомпилированы с макросом _BIND_TO_CURRENT_OPENMP_VERSION. Но они уже скомпилированы с VSSp1. Будут ли какие-либо проблемы с этой настройкой?
- Будет ли какая-либо проблема, если доступна новая версия распространяемого VS (новее, чем 9.0.30729.4248).
Спасибо.
Ответы
Ответ 1
Я бы не использовал ни один из макросов BIND. Вы скоро столкнетесь с неприятностями.
Даже если вы распространёте DLL-среду выполнения VC как частные сборки, вы не можете быть уверены, что пользователь не установил их уже с каким-либо другим приложением.
Возникает одна проблема: вы можете получить манифест, который ссылается на несколько версий c-runtime. Здесь открытая проблема об этом (FYI: у меня была такая же проблема!).
Итак, если нет причин, которые заставили бы вас использовать только определенную версию c-runtime, а не последнюю совместимую, тогда не используйте эти макросы define!
Ответ 2
Нашел этот ресурс блога, у которого есть ответ на ваш вопрос.
Обратитесь к разделу "Обновления, исправления и пакеты обновления"
http://helgeklein.com/blog/2010/03/deploying-visual-c-runtime-files-as-private-assemblies/