Visual C++ 2010: изменения в развертывании среды выполнения MSVC (больше не SxS с манифестом)

Где я могу найти официальную заметку, статью 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 ответа

Решение

Вы уже ответили на большую часть своего вопроса, параллельное развертывание 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 имеет некоторые тонкости, он изолирует вас от благонамеренных, но неудачных обновлений, которые ломают ваше приложение. Хотя теперь вы сами несете ответственность за развертывание обновлений, устраняющих дыру в безопасности. Если это неудобно, разверните и положитесь на копию в системном каталоге.

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

Другие вопросы по тегам