2012-04-21 1 views
1

У меня есть проект C++/CLI, созданный с помощью Visual Studio 2010, который предназначен для .NET Framework 3.5 и PlatformToolset v90. Первоначально он запрашивает VC CRT версии 9.0.21022.8, но если я включаю заголовок atlbase.h, тогда он запрашивает VC CRT версии 9.0.30729.6161. Почему это происходит? И как я могу настроить его на целевой 9.0.30729.6161 без включения atlbase.h?atlbase.h и различные версии VC CRT

Я попытался определить макросы _BIND_TO_CURRENT_CRT_VERSION = 1 и _BIND_TO_CURRENT_VCLIBS_VERSION = 1, но это не помогло.

+0

Почему вам нужен ATL, если вы используете C++/CLI? Либо выполните COM (и используйте ATL, и обычный C++), либо .NET. Не делайте обоих, это требует неприятностей. –

+0

Мне не нужен ATL, мне нужна цель 9.0.30729.6161. Но я могу сделать это, только включив atlbase.h. Итак, вопрос в том, как я могу избавиться от atlbase.h, но все же нацелился на 9.0.30729.6161? – vkrzv

+0

У вас должен быть установлен VS2008 для достижения цели V9.0. Убедитесь, что у вас есть SP1 для VS2008. Удаление + переустановка все должно исправить (у меня никогда не было таких проблем). Он работает с VC++ 2008 Express, если вы не хотите платить за 2 лицензии. –

ответ

3

версия устанавливаются ВМ/включить/crtassem.h, в нижней части вы можете увидеть:

#ifndef _CRT_ASSEMBLY_VERSION 
#if _BIND_TO_CURRENT_CRT_VERSION 
#define _CRT_ASSEMBLY_VERSION "9.0.30729.6161" 
#else 
#define _CRT_ASSEMBLY_VERSION "9.0.21022.8" 
#endif 
#endif 

Так правилом является то, что вы можете явно переопределить версию, #defining _CRT_ASSEMBLY_VERSION. Не делай этого. Как вы отметили в своем вопросе, #defining _BIND_TO_CURRENT_CRT_VERSION до 1 получает вам нужную строку версии.

Возможна проблема с этим в проекте C++/CLI. Вы можете скомпилировать код C++/CLI, не включив ни один из включенных в CRT файлов. Таким образом, вы получите версию по умолчанию, которая, по иронии судьбы, по умолчанию используется компоновщиком для собственной версии CRT. Поэтому обходным путем является явно помещать #include <crtassem.h> в один из файлов исходного кода. #including atlbase.h сделал бы это тоже, так как это делает включают заголовки CRT, но, конечно, большой подход молотка.

Дополнительное устранение неполадок доступно в Project + Properties, C/C++, Advanced, Show Includes = Yes. В окне вывода вы увидите след всех файлов #include.

Опасайтесь, что теперь у вас будет дополнительная нагрузка для обеспечения того, чтобы обновленная версия msvcr90.dll была развернута на компьютере пользователя. Ваша программа не запустится, если она отсутствует или устарела.

+0

Большое спасибо за ваше объяснение. Мое приложение использует CRT как частную сборку, которая всегда имеет версию 9.0.30729.6161. Учитывая, что это будет правильный подход к явно #define _CRT_ASSEMBLY_VERSION "9.0.30729.6161"? – vkrzv

+1

Файл crtassem.h, а также (надеюсь), любая копия, которую вы используете в DLL на вашем компьютере-разработчике, может быть обновлена ​​с помощью исправления безопасности. Это уже произошло пару раз. И так вы закончили с .6161 в своей копии. Таким образом, нет, #defining его самостоятельно - не очень хорошая идея, патч безопасности не собирается обновлять это. –