Как я могу выбрать другую версию фреймворка в другой конфигурации того же проекта? - PullRequest
5 голосов
/ 04 февраля 2012

У меня есть библиотека классов, предназначенная для .NET 3.5. Теперь я хотел бы добавить некоторые функции, для которых требуется .NET 4.0, но я все еще хочу иметь возможность создавать версию для .NET 3.5 (без этих функций, конечно).

В идеале я бы хотел выбрать другую версию фреймворка в зависимости от конфигурации:

  • Debug, Release => .NET 3.5
  • Debug 4.0, выпуск 4.0 => .NET 4.0

К сожалению, это не представляется возможным, поскольку целевая структура является глобальной для всего проекта ...

Есть ли способ обойти это? Я знаю, что мог бы создать второй проект, включающий те же файлы, но это довольно плохо для удобства обслуживания ....

Какой самый простой способ сделать это? Если вы когда-нибудь делали нечто подобное, какой подход работал лучше всего?

Ответы [ 2 ]

4 голосов
/ 04 февраля 2012

Прежде всего, вы можете начать с создания условного символа компиляции, который позволяет включать или исключать дополнительные функции, доступные только для платформы .NET4.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 отдельно в командной строке.

3 голосов
/ 06 августа 2014

Я научился делать это, используя:
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>
      
    • в пределах соответствующего «Debug»

      <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.

...