Я использую 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.
_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.
Мне на самом деле очень нравится, как 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"
можно связать с указанной версией.
Компилятор использует файлы .h и .lib, чтобы определить, какой код CRT использовать. Измените настройки сборки каталога поиска include и lib для вашего проекта, чтобы он просматривал каталоги, в которых существуют соответствующие файлы .lib и .h.
Тем не менее, почему вы чувствуете необходимость использовать что-либо, кроме последней версии CRT?