Условно изменяемая целевая версия фреймворка
Я пытаюсь скомпилировать кодовую базу #ifdef для двух разных целевых сред, а именно 3.5 и 4.0.
Я попытался изменить файлы.proj в решении, но безрезультатно.
Похоже, MSBuild / VS2012 не принимает изменения конфигурации решения через пользовательский интерфейс.
Это фрагмент одного из файлов.proj:
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>..\Binaries\</OutputPath>
<DefineConstants>TRACE;NET35</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug 40|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<OutputPath>..\Binaries\</OutputPath>
<DefineConstants>TRACE;DEBUG;NET40</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>AnyCPU</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
</PropertyGroup>
Когда я переключаюсь на "Debug 40" из "Release", целевая структура не изменяется в свойствах проекта (что приводит к нарушению компиляции из-за других условно-связанных сборок).
У меня также возникают проблемы с условной ссылкой на разные сборки, как если бы, опять же, конфигурация решения не была подхвачена VS/MSBuild (некоторые даже не отображаются в ссылках).
Изменить: я исключаю Microsoft.CSharp из сборки v3.5 со следующей строкой:
<Reference Include="Microsoft.CSharp" Condition=" '$(Configuration)' == 'Debug 40'" />
Пока что кажется, что это просто свойство TargetFrameworkVersion, которое игнорируется.
1 ответ
Оказывается, проблема была двоякой:
- ReSharper (v7) усложняет задачу, отображая ошибки компиляции в разных файлах, усложняя понимание того, что код фактически скомпилирован с условными ссылками. Я думаю, что версия 7 не поддерживает ручные изменения файлов проекта, так что можно обратиться к пользователям RS7.
- VS2012 не изменяет целевую среду в пользовательском интерфейсе (несмотря на то, что при компиляции используется правильная среда, как видно из подробного вывода MSBuild).
В конце концов мне удалось заставить кодовую базу компилироваться с небольшим терпением. Согласно предложению @granataCoder, также лучше сохранить разные пути вывода (это может быть легко упускать из виду при работе с ортогональными проблемами, такими как условная компиляция).