Как распространять библиотеки времени выполнения C (CRT) - PullRequest
5 голосов
/ 11 ноября 2011

Я создаю приложение после преобразования рабочего пространства VC ++ 6 в Visual C ++ 2008 express.Сама по себе сборка идет успешно, но реальная проблема, с которой я столкнулся, связана с созданными манифестами, которые выглядят так:

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level='asInvoker' uiAccess='false' />
      </requestedPrivileges>
    </security>
  </trustInfo>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.30729.1' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
    </dependentAssembly>
  </dependency>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
    </dependentAssembly>
  </dependency>
</assembly>

Мой вопрос:

Как я могу ограничить манифест, чтобы он отображал только ОДНУ версиюпредпочтительно 9.0.21022.8.чтобы я мог связать необходимые зависимости времени C-Run внутри моего приложения?

Я знаю, что основной причиной этой проблемы является зависимость от некоторой библиотеки, которая использует 9.0.21022.8, а мой VC ++ Express 2008 может использовать 9.0.30729.1.вот почему оба перечислены как зависимости.

Примечание:

Я придерживаюсь подхода б) из http://www.codeproject.com/Tips/211756/How-to-Distribute-C-run-time-CRT-Libraries-with-Yo?display=Print, который говорит о копировании файлов DLL CRT и Microsoft.VCXX.CRTФайл .manifest в папке приложения.

1 Ответ

9 голосов
/ 17 ноября 2011

По умолчанию для Visual Studio 2008 используется привязка к версии 9.0.21022.8.Это независимо от того, какую версию пакета обновления или исправления вы установили, поскольку обновления Visual Studio не обязательно должны приводить к необходимости обновления вашего приложения (как описано здесь ).

Возможно другоеверсии: 9.0.30729.1 для пакета обновления 1 или 9.0.30729.6161 для пакета обновления 1 с обновлением безопасности.Есть и другие.

Из-за поведения по умолчанию вполне вероятно, что ваше приложение использует 9.0.21022.8, и есть библиотека, которая была скомпилирована для использования 9.0.30729.1.Вы можете узнать, от какой версии каждой библиотеки зависит, используя следующую командную строку (, описанную здесь ):

dumpbin /directives <name>.lib

Для управления версией времени выполнения, к которому привязано ваше приложение, вы можете определить символы препроцессора в настройках вашего проекта (должны быть в настройках проекта или в командной строке) для привязки к версии по умолчанию (9.0.21022.8 - не определяя их) или для привязки к та же версия , что и у установленной Visual Studio:

_BIND_TO_CURRENT_VCLIBS_VERSION=1

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

Если вы обнаружите, что ваше приложение привязано к 9.0.30729.1, а зависимая библиотека привязана к 9.0.21022.8, то вам просто нужно удалитьопределение препроцессора.

Другая трудность заключается в том, что при обновлении Visual Studio модули слияния во время выполнения в yoРаспространяемая папка также обновляется до этих версий.Поэтому, если у вас есть проект установки, использующий эти модули слияния, и вы пытаетесь привязать его к версии по умолчанию, вы в конечном итоге установите новые версии сред выполнения.

Разрешение версии времени выполнения не будет проблемой, еслиВы также распространяете модули слияния политики времени выполнения, так как загрузчик библиотеки во время выполнения будет смотреть на политику вашего времени выполнения и автоматически загружать самую новую версию, даже если вы привязываетесь к версии по умолчанию.Даже при закрытых сборках загрузчик сначала заглянет в папку WinSxS , поэтому при наличии политик вы будете привязаны к самой новой версии.Таким образом, смешанные номера версий в манифесте будут перенаправлены на самую новую версию.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...