Visual Studio 2010 Beta 2, IncrediBuild, cl.exe

После установки Beta 2 возникла проблема при компиляции C++/CLI проекта с помощью IncrediBuild’a в Visual Studio 2008.

Причем файлы собираемые локально компилируются нормально, а файлы на других машинах выдают сообщения:

file.cpp(12) : warning C4651: ‘/D__CLR_VER=20050727’ specified for precompiled header but not for current compile
file.cpp(12) : fatal error C1108: unable to find DLL: ‘alink.dll’

Немного дизассемблировав c1xx.dll выяснили, что cl.exe кидает ошибку c1108 связанную с alink при попытке загрузить эту dll через функцию LoadLibraryShim. Т.к. никто толком не знает как работает IncrediBuild то просто предположили, что при запуске на удалённой машине cl.exe вызовы функций обращений к реестру перехватываются и возвращаются данные с локальной машины. Предположение скорее всего не верное, но оно натолкнуло на мысль, что есть несоответствие версий между mscoree.dll на локальной и удалённой машинах.

В итоге попробовали на удалённой машине заменить mscoree.dll на 4-ую версию и всё заработало! Но этот вариант не очень устраивал, лучше тогда .Net Framework поставить.

Поковырявшись ещё немного решили запускать cl.exe в “режиме совместимости” (не знаю как это правильно называется в .Net), для этого добавили в реестр следующую запись:

reg add HKLMSOFTWAREWow6432NodeMicrosoft.NETFrameworkPolicyAppPatchv4.0.21006.00000cl.exe{DFA3BDF6-32E8-4fcf-833F-9EE0E63040CB} /v "Target Version" /t reg_sz /d "v2.0.50727"

это WOW64 режима для 64-ёх битной ОСи, для 32-ух битной ОСи или для x64 подойдёт эта команда

reg add HKLMSOFTWAREMicrosoft.NETFrameworkPolicyAppPatchv4.0.21006.00000cl.exe{DFA3BDF6-32E8-4fcf-833F-9EE0E63040CB} /v "Target Version" /t reg_sz /d "v2.0.50727"

После выполнения этих команд всё завелось. По хорошему нужно указать ещё “Maximum File Version” и “Minimum File Version”, но это уже по желанию.

PS. моя любимая утилита procmon в этот раз не помогла 😦

2 Responses to Visual Studio 2010 Beta 2, IncrediBuild, cl.exe

  1. Антон says:

    А почему просто проекту не указать что-то вроде TARGET FRAMEWORK? или так нельзя?Вообще наконец ты что-то написал, спасибо!

  2. Alexey says:

    ну в C++/CLI проектах есть опция TargetFrameworkVersion. У нас она задана со значением "196613" (это вроде 3.5), я пробовал прописывать версию для 2.0 — не помогало.

Оставьте комментарий