Как выбрать версию DLL VC 2008, с которой должно быть связано приложение? - PullRequest
5 голосов
/ 18 февраля 2010

Я использую Visual Studio 2008 SP1 для C ++. При компиляции Visual Studio необходимо выбрать, с какой версией библиотек DLL CRT и MFC приложение должно быть связано, версия 9.0.21022.8 (= RTM), 9.0.30729.17 (= SP1) или 9.0.30729.4148 (= SP1 с обновлением безопасности) , Я хотел бы знать, как вы можете выбрать, какая из двух версий будет связана с. Кто-нибудь знает?

Примечание : это важно при использовании закрытой сборки , поскольку вам необходимо знать, какие версии библиотек VC 9.0 следует скопировать вместе с .exe.

Обратите внимание , что флаг _BIND_TO_CURRENT_VCLIBS_VERSION только гарантирует, что правильная версия включена в манифест. Выбор версии DLL во время выполнения, очевидно, не выполняется в зависимости от версии, включенной в файл манифеста. Даже если в файле манифеста сказано, что следует использовать v21022, в .exe используются файлы v30729 .DLL. Я знаю это, потому что он использует std :: tr1 :: weakptr, которого нет в v21022.

Ответы [ 3 ]

9 голосов
/ 18 февраля 2010

_BIND_TO_CURRENT_VCLIBS_VERSION устанавливает текущую версию в манифесте - или версию RTM, если нет. И установка его в манифесте - верный способ сделать это.

Однако вы видите эффекты файла политики сборки: - Когда установлен пакет VCRedist, содержащий среду выполнения 2008 SP1, он устанавливает файл политики в хранилище WinSxS с записью bindingRedirect, которая перенаправляет попытки загрузить RTM время выполнения до среды выполнения SP1.

Таким образом, приложения, которые указывают время выполнения RTM в своем манифесте, будут загружать среду выполнения SP1, а приложения, которые определяют среду выполнения SP1, будут загружать среду выполнения SP1.

Если вы действительно хотите использовать среду выполнения RTM, даже если установлены среда выполнения SP1 и файлы политики, вам необходимо указать версию RTM в манифесте и использовать файл конфигурации приложения. В основном «yourappname.exe.config» (или «yourdllname.dll.2.config», если его dll знает, что вызывает горе). Файлы конфигурации приложения могут содержать элемент bindingRedirect, который переопределяет любую версию сборки, указанную в манифесте, или файлы политики.

Этот конфигурационный файл сообщит ОС о загрузке среды выполнения RTM, даже если установлена ​​среда выполнения SP1: -

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<configuration>
    <windows>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <dependentAssembly>
                <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"/>
                <bindingRedirect oldVersion="9.0.30729.1" newVersion="9.0.21022.8"/>
            </dependentAssembly>
        </assemblyBinding>
    </windows>
</configuration>

Примечание: oldVersion может быть диапазоном: oldVersion="9.0.30729.1-9.1.0.0"

См .: Файлы конфигурации приложения , документированные в MSDN.

3 голосов
/ 18 февраля 2010

Определив

#define _CRT_ASSEMBLY_VERSION "9.0.30729.1"

или

#define _MFC_ASSEMBLY_VERSION "9.0.30729.1"

Вы можете ссылаться на указанную версию.

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

Компилятор использует файлы .h и .lib, чтобы определить, какой код CRT использовать. Измените настройки сборки каталогов include и lib для своего проекта, чтобы искать в каталогах, где существуют соответствующие файлы .lib и .h.

Тем не менее, почему вы чувствуете необходимость использовать что-либо, кроме новейшего ЭЛТ?

...