Как выбрать версию VC 2008 DLLs, с которым должно быть связано приложение?

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

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

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

5
задан Dimitri C. 23 February 2010 в 14:57
поделиться

3 ответа

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

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

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

Если вы действительно хотите использовать среду исполнения 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"

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

9
ответ дан 13 December 2019 в 05:34
поделиться

Мне на самом деле очень нравится, как maven создает их: http://maven.apache.org/shared/maven-archiver/examples/classpath.html#Make

-121--3279149-

При условии, что оба массива имеют одинаковый размер:

string[] values = { "1", "hello", "true" };
Type[] types = { typeof(int), typeof(string), typeof(bool) };

object[] objects = values
    .Select((value, index) => Convert.ChangeType(value, types[index]))
    .ToArray();
-121--1572214-

Путем определения

#define _CRT_ASSEMBLY_VERSION "9.0.30729.1"

или

#define _MFC_ASSEMBLY_VERSION "9.0.30729.1"

можно связать с указанной версией.

3
ответ дан 13 December 2019 в 05:34
поделиться

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

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

0
ответ дан 13 December 2019 в 05:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: