Как я могу выбрать другую версию фреймворка в другой конфигурации того же проекта?

У меня есть библиотека классов, предназначенная для.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/

В основном, выполните следующие действия:

  1. Откройте файл проекта в текстовом редакторе, чтобы вы могли просматривать / редактировать все XML. Ваш файл проекта - ProjectName.vcxproj.
    • Использование текстового редактора Visual Studio
      1. Выгрузите проект, который вы планируете редактировать. Щелкните правой кнопкой мыши проект, который вы хотите редактировать, и выберите "Разгрузить проект"; оно станет серым.
      2. Используйте Файл-> Открыть-> Файл... Ctrl+O и перейдите к расположению файла ProjectName.vcxproj и откройте его. НЕ ИСПОЛЬЗУЙТЕ Файл-> Открыть-> Проект / Решение.
      3. Когда вы закончите, вы хотите сохранить / закрыть файл и щелкните правой кнопкой мыши проект в обозревателе решений и выберите "Перезагрузить проект"
    • Или просто используйте другой редактор, такой как Notepad++ или даже новый экземпляр Visual Studio.
  2. Следующий:

    • Удалить

      <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
      
    • изнутри

      <PropertyGroup Label="Globals">
      
    • а также

      </PropertyGroup> 
      
    • теги.

  3. Сейчас:

    • Вставить

      <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.
  4. Сохраните изменения (может потребоваться закрыть файл, если вы используете тот же экземпляр Visual Studio, куда будет загружен проект).

  5. Загрузите или перезагрузите проект в Visual Studio и убедитесь, что отдельные конфигурации создаются с использованием разных Frameworks.

Другие вопросы по тегам