Как выбрать, с какой версией библиотек Visual C ++ приложение компилируется? - PullRequest
3 голосов
/ 23 февраля 2010

Я использую Visual Studio 2008 для C ++. При компиляции Visual Studio компилирует файлы заголовков библиотек VC 9.0. Однако существуют разные версии этой библиотеки:

  • v9.0.21022,8 (= RTM)
  • v9.0.30729.17 (= SP1)
  • v9.0.30729.4148 (= SP1 с обновлением безопасности)

Я хотел бы знать, возможно ли сообщить Visual Studio, с какой версией он должен компилироваться.

Причина, по которой я считаю это важным, заключается в том, что установщик приложения должен убедиться, что установлена ​​правильная версия распространяемого пакета Microsoft Visual C ++ 2008. Мне кажется, что я не имею никакого контроля над этой зависимостью, так как некоторые обновления Windows (, а не обновление Visual Studio) могут изменить эту зависимость. Я хотел бы продолжать использовать ту же версию, чтобы избежать затрат на установку обновляющего пакета установщиком.

Обратите внимание , что эта ситуация отличается от моего более раннего вопроса , поскольку этот вопрос касался времени ссылки. Я также не ищу способ управления версией, помещенной во встроенный файл манифеста, как это объясняется здесь .

Ответы [ 4 ]

2 голосов
/ 23 февраля 2010

Манифест, включенный в ваши двоичные файлы, автоматически генерируется системой сборки VS. Важными заголовками, определяющими зависимость от версии, которая передается в манифест, являются vc \ include \ crtassem.h и crtdefs.h. Первый заявляет версию CRT. Обратите внимание, что он уже поддерживает RTM-версию по сравнению с «последней» версией с макросом _BIND_TO_CURRENT_CRT_VERSION. Последний содержит директивы комментария #pragma для встраивания опции компоновщика / manifestdependency в файл .obj, что, в свою очередь, заставляет компоновщик автоматически генерировать манифест.

Вам не нужно делать это таким образом, вы можете просто отключить параметры компоновщика, которые генерируют манифест, и написать свой собственный. Это дает вам полный контроль над версией CRT, к которой привязано ваше приложение. Являетесь ли вы впереди с этим немного сомнительно. Вы, вероятно, все еще отправляете старую версию CRT, которая была обновлена ​​в июле прошлого года, она содержала критическую ошибку безопасности. Клиенты, как правило, недовольны тем, что на их компьютере устанавливается программное обеспечение с хорошо документированными и исправленными недостатками безопасности.


Следующее, что вам нужно сделать, это взять под контроль развертывание библиотек DLL. Вам придется самостоятельно развертывать библиотеки DLL в параллельном кэше WinSxS.

Это сработает, если вы поймете, как, но вряд ли оно выживет очень долго. Центр обновления Windows, если он включен, может обнаружить, что машина использует непатченную версию библиотек DLL, и обновит ее. И разверните политику издателя для перенаправления запросов на загрузку. Вполне вероятно, что на вашем компьютере установлен такой файл политики, если вы видите, что ваш манифестированный запрос версии приводит к загрузке другой версии. Несколько неизбежный вывод заключается в том, что это DLL-библиотека MSFT, и они будут делать с ней то, что они считают необходимым. Посмотрите на развертывание applocal, чтобы избежать этого.

1 голос
/ 23 февраля 2010

Если проблема связана с SP1, вы мало что можете сделать. Microsoft считает среду выполнения, по сути, компонентом операционной системы. Поэтому он получает обновления и исправления так же, как и любой компонент ОС.

Как правило, с этим не должно быть проблем - патчи - это исправления ошибок и обновления безопасности. В принципе, каждое изменение должно сделать ваши приложения более стабильными. Не всегда так, но в любом случае вы ничего не можете с этим поделать.

Существуют варианты изменения времени выполнения, но они связаны с безопасностью потоков и схожими проблемами. В свойствах проекта есть несколько важных мест. В частности, на вкладке C / C ++ / Code Generation вы можете выбрать, какую библиотеку времени выполнения использовать.

Если вы серьезно обеспокоены, вы можете выбрать статически связанную среду выполнения без DLL. Пользователи по-прежнему могут обновлять свои библиотеки DLL времени выполнения, но это не улучшит стабильность вашего приложения.

1 голос
/ 23 февраля 2010

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

0 голосов
/ 23 февраля 2010

Вы можете сделать это, используя файлы ресурсов манифеста, которые написаны на XML.

Мы должны были сделать это на прежнем месте работы, к сожалению (или, возможно, к счастью), я не был знаком с подробностями того, как это было сделано. Эта статья выглядит ближе всего к тому, что мы сделали, что я смог найти по этому вопросу.

Update0

Вот документация MSDN, касающаяся генерации файла манифеста и их использования в изоляции приложений и сборке соседних сборок .

...