Visual C ++ 2010: изменения в развертывании среды выполнения MSVC (больше не SxS с манифестом) - PullRequest
27 голосов
/ 08 июля 2011

Где можно найти официальную заметку, статью kb или другую документацию, описывающую изменения в политике связывания и развертывания Visual Studio 2010 C / C ++ во время выполнения?

В Visual Studio 2008 (со средой выполнения VC90) манифест был встроен в собственные образы, а библиотеки времени выполнения были развернуты в виде параллельных сборок (WinSxS). Это вызывало проблемы при перестройке собственного exe-файла или библиотеки с использованием VS 2008 SP1, поскольку во встроенном манифесте требовалась обновленная версия среды выполнения C ++.

Для VS 2010 и версии среды выполнения MSVCR100 политика, похоже, полностью изменилась.

  1. Файл msvcr100.dll и другие библиотеки времени выполнения C / C ++ больше не устанавливаются как сборки SxS.
  2. При компиляции под VS2010, во время выполнения не добавляется запись «зависимости» во время выполнения, что означает, что любая версия msvcr100.dll может быть загружена во время выполнения.
  3. На компьютерах с установленным .NET 4 соответствующая среда выполнения называется msvcr100_clr0400.dll и не будет загружаться собственным кодом, хотя копия, переименованная в msvcr100.dll, работает нормально. Я думаю, это означает, что любой процесс с кодом C / C ++ всегда будет иметь две загруженные версии одной и той же среды выполнения C / C ++.

Похоже, что это значительное изменение в политике, откат от развертывания SxS и явные зависимости, которые были у нас в VS 2008. Может ли кто-нибудь пролить больше света на то, что изменилось, и, возможно, указать на некоторую документацию, файл readme или сообщение в блоге, которое описывает эти изменения, мотивация и связанные с ними последствия?

Кажется, так будет лучше - сильный манифест версии и развертывание SxS были кошмаром - но я удивлен этими неожиданными и, казалось бы, недокументированными изменениями в VS 2010.

Дополнительный вопрос: Как я могу скомпилировать свою библиотеку C ++ / CLI под VS 2010, чтобы связать ее с msvcr100_clr0400.dll вместо msvcr100.dll? Эта идея заключается в том, что сборка C ++ / CLI должна выполняться без каких-либо зависимостей, кроме тех, которые установлены в .NET 4 (без статического связывания).

Ответы [ 2 ]

16 голосов
/ 08 июля 2011

Вы уже ответили на большую часть своего вопроса, параллельное развертывание CRT было кошмаром, в котором слишком много программистов попали в беду. Microsoft согласилась и отказалась от него для выпуска VS2010. Он вернулся к DLL в c: \ windows \ system32 с именем msvcr100.dll. И msvcp100.dll, vcomp100.dll, atl100.dll, mfc100.dll, mfcm100.dll, другие библиотеки поддержки времени выполнения. Так было для VS2003 и более ранних изданий. Теперь снова пользователь должен разобраться с проблемой DLL в аду. У человека меньше всего шансов сделать это, но у него, как правило, есть бюджет для оплаты поддержки. В отличие от программистов, которым нужна помощь на бесплатном веб-сайте:)

Но вы можете помочь, локальное развертывание приложения теперь снова включено, вы можете развернуть msvcr100.dll в том же каталоге, что и ваш основной EXE-файл. Это было явно проверено и запрещено в предыдущих версиях. App-local имеет некоторые тонкости, он изолирует вас от благонамеренных, но неудачных обновлений, которые ломают ваше приложение. Хотя теперь вы сами несете ответственность за развертывание обновлений, устраняющих брешь в безопасности. Если это неудобно, разверните и положитесь на копию в системном каталоге.

Do not попытаться связать с msvr100_clr0400.dll, это частная копия для использования CLR. Так же, как msvcr.dll является частной копией для использования Microsoft DLL. У вас нет файла .lib, который вам нужен для ссылки на эти библиотеки DLL.

6 голосов
/ 02 марта 2012
...