Как я могу выбрать другую версию фреймворка в другой конфигурации того же проекта?
У меня есть библиотека классов, предназначенная для.NET 3.5. Теперь я хотел бы добавить некоторые функции, которые требуют.NET 4.0, но я все еще хочу иметь возможность генерировать версию, нацеленную на.NET 3.5 (без этих функций, конечно).
В идеале я хотел бы выбрать другую версию фреймворка в зависимости от конфигурации:
- Debug, Release =>.NET 3.5
- Отладка 4.0, выпуск 4.0 => .NET 4.0
К сожалению, это не представляется возможным, поскольку целевая структура является глобальной для всего проекта...
Есть ли способ обойти это? Я знаю, что мог бы создать второй проект, включающий те же файлы, но это довольно плохо для удобства обслуживания....
Какой самый простой способ сделать это? Если вы когда-нибудь делали нечто подобное, какой подход работал лучше всего?
2 ответа
Прежде всего, вы можете начать с создания условного символа компиляции, который позволит вам включать или исключать дополнительные функции, которые доступны только для платформы.NET 4.0.
Кроме того, я думаю, что вам придется использовать MSBuild напрямую, а не позволять VS.NET создавать свой проект. Я сделал что-то подобное однажды. Короче говоря, все сводится к тому, что вам нужно создать 2 задачи сборки в вашем скрипте MSbuild. Тот, который позволяет вам создать свой проект для.NET 3.5, и тот, который позволяет вам создать проект, ориентированный на.NET 4.0.
В каждой задаче сборки вы можете определить целевой каркас и символ условной компиляции, который вы хотите использовать.
Задачи сборки в вашем скрипте сборки могут выглядеть так:
<Target Name="buildall-v4">
<!-- The following ItemGroup defines all the build-constants that have to be used
in the build.
As can be seen, the DEBUG & RELEASE constants are only included when necessary -->
<ItemGroup>
<BuildConstant Include="DEBUG" Condition="'$(buildmode)'=='DEBUG'" />
<BuildConstant Include="RELEASE" Condition="'$(buildmode)'=='RELEASE'" />
<BuildConstant Include="NET_FRAMEWORK_4_0" />
</ItemGroup>
<PropertyGroup>
<BuildConstantsToUse>@(BuildConstant)</BuildConstantsToUse>
</PropertyGroup>
<MSBuild Projects="$(builddir)\Source\MyProject.sln"
Properties="OutputPath=$(outputdir)\v4;Configuration=$(buildmode);DefineConstants=$(BuildConstantsToUse);TargetFrameworkVersion=v4.0" />
</Target>
<Target Name="buildall-v3.5">
<!-- The following ItemGroup defines all the build-constants that have to be used
in the build.
As can be seen, the DEBUG & RELEASE constants are only included when necessary -->
<ItemGroup>
<BuildConstant Include="DEBUG" Condition="'$(buildmode)'=='DEBUG'" />
<BuildConstant Include="RELEASE" Condition="'$(buildmode)'=='RELEASE'" />
</ItemGroup>
<PropertyGroup>
<BuildConstantsToUse>@(BuildConstant)</BuildConstantsToUse>
</PropertyGroup>
<MSBuild Projects="$(builddir)\Source\MyProject.sln"
Properties="OutputPath=$(outputdir)\v3.5\;Configuration=$(buildmode);DefineConstants=$(BuildConstantsToUse);TargetFrameworkVersion=v3.5" />
</Target>
Конечно, когда вы захотите собрать для двух версий, вам придется выполнять каждую команду msbuild отдельно в командной строке.
Я узнал, как это сделать, используя:
http://blogs.msdn.com/b/visualstudio/archive/2010/05/14/a-guide-to-vcxproj-and-props-file-structure.aspx
а также
http://shazwazza.com/post/multi-targeting-a-single-net-project-to-build-for-different-framework-versions/
В основном, выполните следующие действия:
- Откройте файл проекта в текстовом редакторе, чтобы вы могли просматривать / редактировать все XML. Ваш файл проекта - ProjectName.vcxproj.
- Использование текстового редактора Visual Studio
- Выгрузите проект, который вы планируете редактировать. Щелкните правой кнопкой мыши проект, который вы хотите редактировать, и выберите "Разгрузить проект"; оно станет серым.
- Используйте Файл-> Открыть-> Файл... Ctrl+O и перейдите к расположению файла ProjectName.vcxproj и откройте его. НЕ ИСПОЛЬЗУЙТЕ Файл-> Открыть-> Проект / Решение.
- Когда вы закончите, вы хотите сохранить / закрыть файл и щелкните правой кнопкой мыши проект в обозревателе решений и выберите "Перезагрузить проект"
- Или просто используйте другой редактор, такой как Notepad++ или даже новый экземпляр Visual Studio.
- Использование текстового редактора Visual Studio
Следующий:
Удалить
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
изнутри
<PropertyGroup Label="Globals">
а также
</PropertyGroup>
теги.
Сейчас:
Вставить
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
или же
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
в рамках соответствующей "Отладки"
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
или "Отладка 4.0"
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug 4.0|Win32'" Label="Configuration">
- Поскольку он больше не входит в группу свойств 'Globals', убедитесь, что каждая конфигурация имеет
<TargetFrameworkVersion Blah="blah blah">
тег в его PropertyGroup.
- Поскольку он больше не входит в группу свойств 'Globals', убедитесь, что каждая конфигурация имеет
Сохраните изменения (может потребоваться закрыть файл, если вы используете тот же экземпляр Visual Studio, куда будет загружен проект).
Загрузите или перезагрузите проект в Visual Studio и убедитесь, что отдельные конфигурации создаются с использованием разных Frameworks.