Вы уверены, что вам нужно установить целевой фреймворк на 2.0?
Не может ли проект 2.0 ссылаться на проект 4.0 (или каким-либо другим образом преобразованный проект)?
При просмотре файлов MSBuild команда, кажется, добавлена из-за этих строк в Microsoft.CppBuild.targets
(на моем компьютере, расположенном в C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0
:
<ClCompile Condition="'@(ClCompile)' != '' and '$(CLRSupport)' != 'false' and '$(CLRSupport)' != ''">
<AdditionalUsingDirectories>$(TargetFrameworkDirectory);%(ClCompile.AdditionalUsingDirectories)</AdditionalUsingDirectories>
<AdditionalOptions Condition="('$(TargetFrameworkVersion)' == 'v3.5' or '$(TargetFrameworkVersion)' == 'v3.0' or '$(TargetFrameworkVersion)' == 'v2.0')">/d1clr:nostdlib %(ClCompile.AdditionalOptions)</AdditionalOptions>
<AdditionalOptions Condition="'$(TargetFrameworkVersion)' == 'v4.0'">/clr:nostdlib %(ClCompile.AdditionalOptions)</AdditionalOptions>
</ClCompile>
Другими словами, он добавляется просто потому, что вы устанавливаете целевую версию фреймворка на значение, отличное от 4.0. (Если бы он был установлен на 4.0, он бы вместо этого добавил флаг /clr:nostdlib
)
Я понятия не имею, почему это не сработает при прямом вызове через MSBuild. Возможно, он использует другую версию компилятора (PATH
или какая-то другая переменная окружения установлена неправильно, возможно?)
При сборке через Visual Studio он также вызывает MSBuild, поэтому на самом деле не должно иметь никакого значения, что вы вызываете MSBuild «напрямую», если какая-то часть среды не настроена по-другому. (или вы вызываете MSBuild с неправильными флагами)
Конечно, в этих файлах MSBuild нет ничего «волшебного», так что вы можете изменить их или отредактировать свой проект, ссылаясь на отдельные их версии (которые вы изменили, чтобы не вставлять флаг). Это, если вы игнорируете беспорядок XML, просто система сборки общего назначения. У него нет «встроенного» понимания проектов VC ++, кроме того, что указано в этих файлах XML.